Merge branch 'master' of github.com:MT-CTF/capturetheflag into dev5.0
This commit is contained in:
commit
0095c18678
9 changed files with 127 additions and 64 deletions
|
@ -6,7 +6,7 @@ barrier = 106
|
||||||
regen_interval = 6
|
regen_interval = 6
|
||||||
regen_amount = 1
|
regen_amount = 1
|
||||||
random_messages_interval = 60
|
random_messages_interval = 60
|
||||||
sprint_stamina = 5
|
sprint_stamina = 10
|
||||||
enable_lavacooling = false
|
enable_lavacooling = false
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
|
@ -46,20 +46,11 @@ crafting.register_recipe({
|
||||||
level = 1,
|
level = 1,
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Furnace <== Cobble x8
|
-- Furnace <== group:stone x8
|
||||||
crafting.register_recipe({
|
crafting.register_recipe({
|
||||||
type = "inv",
|
type = "inv",
|
||||||
output = "default:furnace",
|
output = "default:furnace",
|
||||||
items = { "default:cobble 8" },
|
items = { "group:stone 8" },
|
||||||
always_known = true,
|
|
||||||
level = 1,
|
|
||||||
})
|
|
||||||
|
|
||||||
-- Furnace <== Desert cobble x8
|
|
||||||
crafting.register_recipe({
|
|
||||||
type = "inv",
|
|
||||||
output = "default:furnace",
|
|
||||||
items = { "default:desert_cobble 8" },
|
|
||||||
always_known = true,
|
always_known = true,
|
||||||
level = 1,
|
level = 1,
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
# CTF Map
|
# CTF Map
|
||||||
|
|
||||||
This mod handles multiple maps.
|
This mod handles creating and loading maps.
|
||||||
|
|
||||||
# Creating a new map
|
## Creating a new map
|
||||||
|
|
||||||
## 1. Dependencies
|
### 1. Dependencies
|
||||||
|
|
||||||
* Minetest 0.4.16 or later.
|
* Minetest 0.4.16 or later.
|
||||||
* Mods
|
* Mods
|
||||||
* ctf_map (by copying the folder from this game to `minetest/mods`)
|
* ctf_map (by copying the folder from this game to `minetest/mods`)
|
||||||
* worldedit and worldedit_commands.
|
* worldedit and worldedit_commands.
|
||||||
|
|
||||||
## 2. Find an area
|
### 2. Find an area
|
||||||
|
|
||||||
* Can use Minetest Game and any mapgen.
|
* Can use Minetest Game and any mapgen.
|
||||||
* It must be a cube, and the barrier will be in the exact center.
|
* It must be a cube, and the barrier will be in the exact center.
|
||||||
* It should be around 230x230 in surface area, but this can vary.
|
* It should be around 230x230 in surface area, but this can vary.
|
||||||
* Feel free to modify the area to your needs.
|
* Feel free to modify the area to your needs.
|
||||||
|
|
||||||
## 3. Select the area
|
### 3. Select the area
|
||||||
|
|
||||||
There are multiple ways do this, this is the simplist in most cases.
|
There are multiple ways do this, this is the simplist in most cases.
|
||||||
|
|
||||||
|
@ -32,20 +32,53 @@ There are multiple ways do this, this is the simplist in most cases.
|
||||||
* Check that the center location is the right place for the barrier to go.
|
* Check that the center location is the right place for the barrier to go.
|
||||||
* Check that the bounds extend far enough.
|
* Check that the bounds extend far enough.
|
||||||
|
|
||||||
## 4. Place barriers
|
### 4. Place barriers
|
||||||
|
|
||||||
* Set the middle barrier direction. The barrier is a plane defined by a co-ordinate = 0.
|
* Set the middle barrier direction. The barrier is a plane defined by a co-ordinate = 0.
|
||||||
If the barrier is X=0, then it will placed with every node of the barrier having X=0.
|
If the barrier is X=0, then it will placed with every node of the barrier having X=0.
|
||||||
If the barrier is Z=0, then it will placed with every node of the barrier having Z=0.
|
If the barrier is Z=0, then it will placed with every node of the barrier having Z=0.
|
||||||
* Click "place barrier". Note that this command does not have an undo.
|
* Click "place barrier". Note that this command does not have an undo.
|
||||||
|
|
||||||
## 5. Meta data
|
### 5. Meta data
|
||||||
|
|
||||||
* Set the meta data
|
* Set the meta data
|
||||||
|
|
||||||
## 6. Export
|
### 6. Export
|
||||||
|
|
||||||
* Click export, and wait until completion.
|
* Click export, and wait until completion.
|
||||||
* Copy the two files from `worlddir/schemes/` to `ctf_map/maps/`.
|
* Copy the two files from `worlddir/schems/` to `ctf_map/maps/`.
|
||||||
* Rename the files so the two prefixed numbers are consistent to existing maps.
|
* Rename the files so the two prefixed numbers are consistent to existing maps.
|
||||||
* Profit!
|
* Profit!
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
### Map meta
|
||||||
|
|
||||||
|
Each map's metadata is stored in an accompanying .conf file containing the following data:
|
||||||
|
|
||||||
|
* `name`: Name of map.
|
||||||
|
* `author`: Author of the map.
|
||||||
|
* `hint`: [Optional] Helpful hint or tip for unique maps, to help players understand the map.
|
||||||
|
* `rotation`: Rotation of the schem. [`x`|`z`]
|
||||||
|
* `schematic`: Name of the map's schematic.
|
||||||
|
* `initial_stuff`: [Optional] Comma-separated list of itemstacks to be given to the player on join and on respawn.
|
||||||
|
* `treasures`: [Optional] List of treasures to be registered for the map, in a serialized format. Refer to the `treasures` sub-section for more details.
|
||||||
|
* `r`: Radius of the map.
|
||||||
|
* `h`: Height of the map.
|
||||||
|
* `team.i`: Name of team `i`.
|
||||||
|
* `team.i.color`: Color of team `i`.
|
||||||
|
* `team.i.pos`: Position of team `i`'s flag, relative to center of schem.
|
||||||
|
* `chests.i.from`, `chests.i.to`: [Optional] Positions of diagonal corners of custom chest zone `i`, relative to the center of the schem.
|
||||||
|
* `chests.i.n`: [Optional] Number of chests to place in custom chest zone `i`.
|
||||||
|
|
||||||
|
#### `treasures`
|
||||||
|
|
||||||
|
`treasures` is a list of treasures to be registered for this map in serialized format.
|
||||||
|
|
||||||
|
An example `treasures` value that registers steel pick, shotgun, and grenade:
|
||||||
|
|
||||||
|
```lua
|
||||||
|
treasures = default:pick_steel,0.5,5,1,10;shooter:shotgun,0.04,2,1;shooter:grenade,0.08,2,1
|
||||||
|
```
|
||||||
|
|
||||||
|
(See [here](../../other/treasurer/README.md) to understand the magic numbers)
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
default
|
default
|
||||||
|
ctf_treasure?
|
||||||
|
stairs?
|
||||||
|
wool?
|
||||||
ctf_team_base?
|
ctf_team_base?
|
||||||
ctf?
|
ctf?
|
||||||
ctf_match?
|
ctf_match?
|
||||||
|
|
|
@ -137,10 +137,12 @@ function ctf_match.load_map_meta(idx, name)
|
||||||
local meta = Settings(conf_path)
|
local meta = Settings(conf_path)
|
||||||
|
|
||||||
if meta:get("r") == nil then
|
if meta:get("r") == nil then
|
||||||
error("Map was not properly configured " .. conf_path)
|
error("Map was not properly configured: " .. conf_path)
|
||||||
end
|
end
|
||||||
|
|
||||||
local initial_stuff = meta:get("initial_stuff")
|
local initial_stuff = meta:get("initial_stuff")
|
||||||
|
local treasures = meta:get("treasures")
|
||||||
|
treasures = treasures and treasures:split(";")
|
||||||
local map = {
|
local map = {
|
||||||
idx = idx,
|
idx = idx,
|
||||||
name = meta:get("name"),
|
name = meta:get("name"),
|
||||||
|
@ -149,11 +151,12 @@ function ctf_match.load_map_meta(idx, name)
|
||||||
rotation = meta:get("rotation"),
|
rotation = meta:get("rotation"),
|
||||||
schematic = name .. ".mts",
|
schematic = name .. ".mts",
|
||||||
initial_stuff = initial_stuff and initial_stuff:split(","),
|
initial_stuff = initial_stuff and initial_stuff:split(","),
|
||||||
|
treasures = treasures,
|
||||||
r = tonumber(meta:get("r")),
|
r = tonumber(meta:get("r")),
|
||||||
h = tonumber(meta:get("h")),
|
h = tonumber(meta:get("h")),
|
||||||
offset = offset,
|
offset = offset,
|
||||||
teams = {},
|
teams = {},
|
||||||
chests = {},
|
chests = {}
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(map.r <= max_r)
|
assert(map.r <= max_r)
|
||||||
|
@ -176,6 +179,35 @@ function ctf_match.load_map_meta(idx, name)
|
||||||
i = i + 1
|
i = i + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Register per-map treasures or the default set of treasures
|
||||||
|
-- if treasures field hasn't been defined in map meta
|
||||||
|
if treasurer and ctf_treasure then
|
||||||
|
treasurer.treasures = {}
|
||||||
|
if treasures then
|
||||||
|
for _, item in pairs(treasures) do
|
||||||
|
item = item:split(",")
|
||||||
|
-- treasurer.register_treasure(name, rarity, preciousness, count)
|
||||||
|
if #item == 4 then
|
||||||
|
treasurer.register_treasure(item[1],
|
||||||
|
tonumber(item[2]),
|
||||||
|
tonumber(item[3]),
|
||||||
|
tonumber(item[4]))
|
||||||
|
-- treasurer.register_treasure(name, rarity, preciousness, {min, max})
|
||||||
|
elseif #item == 5 then
|
||||||
|
treasurer.register_treasure(item[1],
|
||||||
|
tonumber(item[2]),
|
||||||
|
tonumber(item[3]),
|
||||||
|
{
|
||||||
|
tonumber(item[4]),
|
||||||
|
tonumber(item[5])
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
ctf_treasure.register_default_treasures()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- Read custom chest zones from config
|
-- Read custom chest zones from config
|
||||||
i = 1
|
i = 1
|
||||||
while meta:get("chests." .. i .. ".from") do
|
while meta:get("chests." .. i .. ".from") do
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
local tablecolumns = {
|
local tablecolumns = {
|
||||||
"tablecolumns[color;",
|
"tablecolumns[color;",
|
||||||
"text;",
|
"text;",
|
||||||
"text,width=20;",
|
"text,width=16;",
|
||||||
"text,width=4;",
|
"text,width=4;",
|
||||||
"text,width=4;",
|
"text,width=4;",
|
||||||
"text,width=4;",
|
"text,width=4;",
|
||||||
|
|
|
@ -1,2 +1 @@
|
||||||
treasurer
|
treasurer
|
||||||
default
|
|
||||||
|
|
|
@ -1,21 +1,25 @@
|
||||||
treasurer.register_treasure("default:ladder",0.3,5,{1,20})
|
ctf_treasure = {}
|
||||||
treasurer.register_treasure("default:torch",0.3,5,{1,20})
|
|
||||||
treasurer.register_treasure("default:cobble",0.4,5,{45,99})
|
|
||||||
treasurer.register_treasure("default:apple",0.3,5,{1,8})
|
|
||||||
treasurer.register_treasure("default:wood",0.3,5,{30,60})
|
|
||||||
treasurer.register_treasure("doors:door_steel",0.3,5,{1,3})
|
|
||||||
|
|
||||||
treasurer.register_treasure("default:pick_steel",0.5,5,{1,10})
|
function ctf_treasure.register_default_treasures()
|
||||||
treasurer.register_treasure("default:sword_stone",0.6,5,{1,10})
|
treasurer.register_treasure("default:ladder",0.3,5,{1,20})
|
||||||
treasurer.register_treasure("default:sword_steel",0.4,5,{1,4})
|
treasurer.register_treasure("default:torch",0.3,5,{1,20})
|
||||||
treasurer.register_treasure("default:shovel_stone",0.6,5,{1,10})
|
treasurer.register_treasure("default:cobble",0.4,5,{45,99})
|
||||||
treasurer.register_treasure("default:shovel_steel",0.3,5,{1,10})
|
treasurer.register_treasure("default:apple",0.3,5,{1,8})
|
||||||
|
treasurer.register_treasure("default:wood",0.3,5,{30,60})
|
||||||
|
treasurer.register_treasure("doors:door_steel",0.3,5,{1,3})
|
||||||
|
|
||||||
treasurer.register_treasure("shooter:crossbow",0.5,2,{1,5})
|
treasurer.register_treasure("default:pick_steel",0.5,5,{1,10})
|
||||||
treasurer.register_treasure("shooter:pistol",0.4,2,{1,5})
|
treasurer.register_treasure("default:sword_stone",0.6,5,{1,10})
|
||||||
treasurer.register_treasure("shooter:rifle",0.1,2,{1,2})
|
treasurer.register_treasure("default:sword_steel",0.4,5,{1,4})
|
||||||
treasurer.register_treasure("shooter:shotgun",0.04,2,1)
|
treasurer.register_treasure("default:shovel_stone",0.6,5,{1,10})
|
||||||
treasurer.register_treasure("shooter:grenade",0.08,2,1)
|
treasurer.register_treasure("default:shovel_steel",0.3,5,{1,10})
|
||||||
treasurer.register_treasure("shooter:machine_gun",0.02,2,1)
|
|
||||||
treasurer.register_treasure("shooter:ammo",0.3,2,{1,10})
|
treasurer.register_treasure("shooter:crossbow",0.5,2,{1,5})
|
||||||
treasurer.register_treasure("shooter:arrow_white",0.5,2,{2,18})
|
treasurer.register_treasure("shooter:pistol",0.4,2,{1,5})
|
||||||
|
treasurer.register_treasure("shooter:rifle",0.1,2,{1,2})
|
||||||
|
treasurer.register_treasure("shooter:shotgun",0.04,2,1)
|
||||||
|
treasurer.register_treasure("shooter:grenade",0.08,2,1)
|
||||||
|
treasurer.register_treasure("shooter:machine_gun",0.02,2,1)
|
||||||
|
treasurer.register_treasure("shooter:ammo",0.3,2,{1,10})
|
||||||
|
treasurer.register_treasure("shooter:arrow_white",0.5,2,{2,18})
|
||||||
|
end
|
||||||
|
|
|
@ -32,6 +32,7 @@ end
|
||||||
|
|
||||||
minetest.register_entity("shooter:arrow_entity", {
|
minetest.register_entity("shooter:arrow_entity", {
|
||||||
physical = false,
|
physical = false,
|
||||||
|
collide_with_objects = false,
|
||||||
visual = "mesh",
|
visual = "mesh",
|
||||||
mesh = "shooter_arrow.b3d",
|
mesh = "shooter_arrow.b3d",
|
||||||
visual_size = {x=1, y=1},
|
visual_size = {x=1, y=1},
|
||||||
|
@ -48,7 +49,7 @@ minetest.register_entity("shooter:arrow_entity", {
|
||||||
stop = function(self, pos)
|
stop = function(self, pos)
|
||||||
local acceleration = {x=0, y=-10, z=0}
|
local acceleration = {x=0, y=-10, z=0}
|
||||||
if self.state == "stuck" then
|
if self.state == "stuck" then
|
||||||
pos = pos or self.object:getpos()
|
pos = pos or self.object:get_pos()
|
||||||
acceleration = {x=0, y=0, z=0}
|
acceleration = {x=0, y=0, z=0}
|
||||||
end
|
end
|
||||||
if pos then
|
if pos then
|
||||||
|
@ -56,24 +57,24 @@ minetest.register_entity("shooter:arrow_entity", {
|
||||||
end
|
end
|
||||||
self.object:set_properties({
|
self.object:set_properties({
|
||||||
physical = true,
|
physical = true,
|
||||||
collisionbox = {-1/8,-1/8,-1/8, 1/8,1/8,1/8},
|
collisionbox = {-1/8, -1/8, -1/8, 1/8, 1/8, 1/8},
|
||||||
})
|
})
|
||||||
self.object:setvelocity({x=0, y=0, z=0})
|
self.object:set_velocity({x=0, y=0, z=0})
|
||||||
self.object:setacceleration(acceleration)
|
self.object:set_acceleration(acceleration)
|
||||||
end,
|
end,
|
||||||
strike = function(self, object)
|
strike = function(self, object)
|
||||||
local puncher = self.player
|
local puncher = self.player
|
||||||
if puncher and shooter:is_valid_object(object) then
|
if puncher and shooter:is_valid_object(object) then
|
||||||
if puncher ~= object then
|
if puncher ~= object then
|
||||||
local dir = puncher:get_look_dir()
|
local dir = puncher:get_look_dir()
|
||||||
local p1 = puncher:getpos()
|
local p1 = puncher:get_pos()
|
||||||
local p2 = object:getpos()
|
local p2 = object:get_pos()
|
||||||
local tpos = get_target_pos(p1, p2, dir, 0)
|
local tpos = get_target_pos(p1, p2, dir, 0)
|
||||||
shooter:spawn_particles(tpos, SHOOTER_EXPLOSION_TEXTURE)
|
shooter:spawn_particles(tpos, SHOOTER_EXPLOSION_TEXTURE)
|
||||||
object:punch(puncher, nil, SHOOTER_ARROW_TOOL_CAPS, dir)
|
object:punch(puncher, nil, SHOOTER_ARROW_TOOL_CAPS, dir)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
self:stop(object:getpos())
|
self:stop(object:get_pos())
|
||||||
end,
|
end,
|
||||||
on_activate = function(self, staticdata)
|
on_activate = function(self, staticdata)
|
||||||
self.object:set_armor_groups({immortal=1})
|
self.object:set_armor_groups({immortal=1})
|
||||||
|
@ -129,7 +130,7 @@ minetest.register_entity("shooter:arrow_entity", {
|
||||||
local frame = get_animation_frame(dir)
|
local frame = get_animation_frame(dir)
|
||||||
self.object:set_animation({x=frame, y=frame}, 0)
|
self.object:set_animation({x=frame, y=frame}, 0)
|
||||||
local objects = minetest.get_objects_inside_radius(pos, 5)
|
local objects = minetest.get_objects_inside_radius(pos, 5)
|
||||||
for _,obj in ipairs(objects) do
|
for _, obj in ipairs(objects) do
|
||||||
if shooter:is_valid_object(obj) and obj ~= self.player then
|
if shooter:is_valid_object(obj) and obj ~= self.player then
|
||||||
local collisionbox = {-0.25,-1.0,-0.25, 0.25,0.8,0.25}
|
local collisionbox = {-0.25,-1.0,-0.25, 0.25,0.8,0.25}
|
||||||
local offset = SHOOTER_PLAYER_OFFSET
|
local offset = SHOOTER_PLAYER_OFFSET
|
||||||
|
@ -141,7 +142,7 @@ minetest.register_entity("shooter:arrow_entity", {
|
||||||
collisionbox = def.collisionbox or collisionbox
|
collisionbox = def.collisionbox or collisionbox
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
local opos = vector.add(obj:getpos(), offset)
|
local opos = vector.add(obj:get_pos(), offset)
|
||||||
local ray = {pos=pos, dir=dir}
|
local ray = {pos=pos, dir=dir}
|
||||||
local plane = {pos=opos, normal={x=-1, y=0, z=-1}}
|
local plane = {pos=opos, normal={x=-1, y=0, z=-1}}
|
||||||
local ipos = shooter:get_intersect_pos(ray, plane, collisionbox)
|
local ipos = shooter:get_intersect_pos(ray, plane, collisionbox)
|
||||||
|
@ -183,7 +184,7 @@ for _, color in pairs(dye_basecolors) do
|
||||||
itemstack:add_wear(65535/SHOOTER_CROSSBOW_USES)
|
itemstack:add_wear(65535/SHOOTER_CROSSBOW_USES)
|
||||||
end
|
end
|
||||||
itemstack = "shooter:crossbow 1 "..itemstack:get_wear()
|
itemstack = "shooter:crossbow 1 "..itemstack:get_wear()
|
||||||
local pos = user:getpos()
|
local pos = user:get_pos()
|
||||||
local dir = user:get_look_dir()
|
local dir = user:get_look_dir()
|
||||||
local yaw = user:get_look_yaw()
|
local yaw = user:get_look_yaw()
|
||||||
if pos and dir and yaw then
|
if pos and dir and yaw then
|
||||||
|
@ -202,9 +203,9 @@ for _, color in pairs(dye_basecolors) do
|
||||||
})
|
})
|
||||||
minetest.sound_play("shooter_throw", {object=obj})
|
minetest.sound_play("shooter_throw", {object=obj})
|
||||||
local frame = get_animation_frame(dir)
|
local frame = get_animation_frame(dir)
|
||||||
obj:setyaw(yaw + math.pi)
|
obj:set_yaw(yaw + math.pi)
|
||||||
obj:set_animation({x=frame, y=frame}, 0)
|
obj:set_animation({x=frame, y=frame}, 0)
|
||||||
obj:setvelocity({x=dir.x * 14, y=dir.y * 14, z=dir.z * 14})
|
obj:set_velocity({x=dir.x * 14, y=dir.y * 14, z=dir.z * 14})
|
||||||
if pointed_thing.type ~= "nothing" then
|
if pointed_thing.type ~= "nothing" then
|
||||||
local ppos = minetest.get_pointed_thing_position(pointed_thing, false)
|
local ppos = minetest.get_pointed_thing_position(pointed_thing, false)
|
||||||
local _, npos = minetest.line_of_sight(pos, ppos, 1)
|
local _, npos = minetest.line_of_sight(pos, ppos, 1)
|
||||||
|
@ -227,7 +228,7 @@ for _, color in pairs(dye_basecolors) do
|
||||||
return itemstack
|
return itemstack
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
obj:setacceleration({x=dir.x * -3, y=-5, z=dir.z * -3})
|
obj:set_acceleration({x=dir.x * -3, y=-5, z=dir.z * -3})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return itemstack
|
return itemstack
|
||||||
|
@ -284,7 +285,7 @@ if SHOOTER_ENABLE_CRAFTING == true then
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "shooter:arrow_"..color,
|
output = "shooter:arrow_"..color,
|
||||||
recipe = {
|
recipe = {
|
||||||
{"", "dye:"..color, "shooter:arrow_white"},
|
{"", "dye:" .. color, "shooter:arrow_white"},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue