|
@ -4,6 +4,7 @@
|
|||
.LSOverride
|
||||
|
||||
mods/test
|
||||
mods/weapons/sounds
|
||||
|
||||
# Icon must end with two \r
|
||||
Icon
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"C_Cpp.errorSquiggles": "Enabled"
|
||||
}
|
|
@ -1,2 +1,2 @@
|
|||
name = SolarSail
|
||||
disallowed_mapgens = v5,v6,carpathian,v7,fractal,valleys
|
||||
disallowed_mapgens = v6
|
|
@ -1,2 +1,4 @@
|
|||
time_speed = 4
|
||||
dedicated_server_step = 0.03
|
||||
dedicated_server_step = 0.03
|
||||
mapgen_limit = 256
|
||||
item_entity_ttl = 1
|
|
@ -0,0 +1,201 @@
|
|||
-- SolarSail Engine HSVA -> RGBA -> HSVA handling:
|
||||
-- Author: Jordach
|
||||
-- License: Reserved
|
||||
|
||||
function solarsail.util.functions.hex_is_valid(color)
|
||||
local patterns = {"%x%x%x%x%x%x", "%x%x%x", "%x%x%x%x%x%x%x%x"} -- Standard, shortened, alpha
|
||||
for _, pat in pairs(patterns) do
|
||||
if color:find("^#"..pat.."$") then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
-- Convert between 1000 units and 1.0
|
||||
function solarsail.util.functions.from_slider_hsv(value)
|
||||
value = tonumber(value)
|
||||
return value/1000
|
||||
end
|
||||
-- ...and back
|
||||
function solarsail.util.functions.to_slider_hsv(value)
|
||||
return value*1000
|
||||
end
|
||||
|
||||
-- HSV -> RGBA and RGBA -> HSV conversions
|
||||
-- taken from: https://github.com/EmmanuelOga/columns/blob/master/utils/color.lua
|
||||
-- License info for hsv_rgba and rgba_hsv and rgb_hsl: CC-BY 3.0
|
||||
|
||||
--[[
|
||||
* Converts an HSV color value to RGB. Conversion formula
|
||||
* adapted from http://en.wikipedia.org/wiki/HSV_color_space.
|
||||
* Assumes h, s, and v are contained in the set [0, 1] and
|
||||
* returns r, g, and b in the set [0, 255].
|
||||
*
|
||||
* @param Number h The hue
|
||||
* @param Number s The saturation
|
||||
* @param Number v The value
|
||||
* @return Array The RGB representation
|
||||
]]--
|
||||
|
||||
function solarsail.util.functions.hsv_rgba(h, s, v, a)
|
||||
local r, g, b
|
||||
|
||||
local i = math.floor(h * 6);
|
||||
local f = h * 6 - i;
|
||||
local p = v * (1 - s);
|
||||
local q = v * (1 - f * s);
|
||||
local t = v * (1 - (1 - f) * s);
|
||||
|
||||
i = i % 6
|
||||
|
||||
if i == 0 then r, g, b = v, t, p
|
||||
elseif i == 1 then r, g, b = q, v, p
|
||||
elseif i == 2 then r, g, b = p, v, t
|
||||
elseif i == 3 then r, g, b = p, q, v
|
||||
elseif i == 4 then r, g, b = t, p, v
|
||||
elseif i == 5 then r, g, b = v, p, q
|
||||
end
|
||||
|
||||
return r * 255, g * 255, b * 255, a * 255
|
||||
end
|
||||
|
||||
--[[
|
||||
* Converts an RGB color value to HSV. Conversion formula
|
||||
* adapted from http://en.wikipedia.org/wiki/HSV_color_space.
|
||||
* Assumes r, g, and b are contained in the set [0, 255] and
|
||||
* returns h, s, and v in the set [0, 1].
|
||||
*
|
||||
* @param Number r The red color value
|
||||
* @param Number g The green color value
|
||||
* @param Number b The blue color value
|
||||
* @return Array The HSV representation
|
||||
]]--
|
||||
|
||||
function solarsail.util.functions.rgba_hsv(r, g, b, a)
|
||||
r, g, b, a = r / 255, g / 255, b / 255, a / 255
|
||||
local max, min = math.max(r, g, b), math.min(r, g, b)
|
||||
local h, s, v
|
||||
v = max
|
||||
|
||||
local d = max - min
|
||||
if max == 0 then s = 0 else s = d / max end
|
||||
|
||||
if max == min then
|
||||
h = 0 -- achromatic
|
||||
else
|
||||
if max == r then
|
||||
h = (g - b) / d
|
||||
if g < b then h = h + 6 end
|
||||
elseif max == g then h = (b - r) / d + 2
|
||||
elseif max == b then h = (r - g) / d + 4
|
||||
end
|
||||
h = h / 6
|
||||
end
|
||||
|
||||
return h, s, v, a
|
||||
end
|
||||
|
||||
local hud_ref = {}
|
||||
hud_ref.hue = {}
|
||||
hud_ref.sat = {}
|
||||
hud_ref.val = {}
|
||||
hud_ref.alpha = {}
|
||||
|
||||
--[[ solarsail.color.rgba
|
||||
Read only; to be used as temporary memory for storing custom colours in.
|
||||
]]
|
||||
solarsail.color.rgba = {}
|
||||
|
||||
function solarsail.util.functions.get_hsva_formspec(player, pos)
|
||||
local name = player:get_player_name()
|
||||
local rgba = table.copy(solarsail.color.rgba[name])
|
||||
|
||||
local h, s, v, a = solarsail.util.functions.rgba_hsv(rgba.r, rgba.g, rgba.b, rgba.a)
|
||||
local curr_rgb = minetest.rgba(rgba.r, rgba.g, rgba.b)
|
||||
|
||||
local min_sat = minetest.rgba(solarsail.util.functions.hsv_rgba(h, 0, v, a))
|
||||
local max_sat = minetest.rgba(solarsail.util.functions.hsv_rgba(h, 1, v, a))
|
||||
|
||||
local min_val = minetest.rgba(solarsail.util.functions.hsv_rgba(h, s, 0, a))
|
||||
local max_val = minetest.rgba(solarsail.util.functions.hsv_rgba(h, s, 1, a))
|
||||
|
||||
local smin = minetest.formspec_escape("(solarsail_ui_gradient.png^[multiply:"..min_sat..")^")
|
||||
local smax = minetest.formspec_escape("(solarsail_ui_gradient_flip.png^[multiply:"..max_sat..")")
|
||||
|
||||
local vmin = minetest.formspec_escape("(solarsail_ui_gradient.png^[multiply:"..min_val..")^")
|
||||
local vmax = minetest.formspec_escape("(solarsail_ui_gradient_flip.png^[multiply:"..max_val..")")
|
||||
|
||||
local alp = minetest.formspec_escape("solarsail_ui_gradient_flip.png^[multiply:"..curr_rgb)
|
||||
local formspec = "container["..pos.x..","..pos.y.."]"..
|
||||
-- HSV sliders
|
||||
"label[0.28,0;Hue: "..string.format("%.2f", tostring(h)).."]"..
|
||||
"background9[0.28, 0.25;4.44, 0.8;solarsail_hsv_spectrum.png;false;1,1]".. -- +0.25 from label, +0.5 from label
|
||||
"scrollbar[0,0.5;5,0.3;horizontal;h;"..tostring(solarsail.util.functions.to_slider_hsv(h))..";false]"..
|
||||
|
||||
"label[0.28,1.3;Saturation: "..string.format("%.2f", tostring(s)).."]".. -- +0.5 from scrollbar
|
||||
"background9[0.28,1.55;4.44,0.8;".. smin .. smax ..";false;1,1]" ..
|
||||
"scrollbar[0,1.8;5,0.3;horizontal;s;"..tostring(solarsail.util.functions.to_slider_hsv(s)).."]"..
|
||||
|
||||
"label[0.28,2.6;Value: "..string.format("%.2f", tostring(v)).."]"..
|
||||
"background9[0.28,2.85;4.44,0.8;".. vmin .. vmax .. ";false;1,1]"..
|
||||
"scrollbar[0,3.1;5,0.3;horizontal;v;"..tostring(solarsail.util.functions.to_slider_hsv(v)).."]"..
|
||||
|
||||
"label[0.28,3.9;Alpha: "..string.format("%.2f", tostring(a)).."]"..
|
||||
"background9[0.28,4.15;4.44,0.8;"..alp..";false;1,1]"..
|
||||
"scrollbar[0,4.4;5,0.3;horizontal;a;"..tostring(solarsail.util.functions.to_slider_hsv(a)).."]"..
|
||||
"container_end[]"
|
||||
return formspec
|
||||
end
|
||||
|
||||
minetest.register_chatcommand("colortag", {
|
||||
params = "demo",
|
||||
description = "demo",
|
||||
func = function(name, param)
|
||||
local player = minetest.get_player_by_name(name)
|
||||
local formspec = "formspec_version[1]"..
|
||||
"size[20, 10;false]"..
|
||||
"position[0.5, 0.5]"..
|
||||
"bgcolor[#00000000;neither]"..
|
||||
"real_coordinates[true]"..
|
||||
"background9[19.5,6.5;6,6.05;solarsail_nineslice_1.png;false;2,2]"
|
||||
|
||||
formspec = formspec .. solarsail.util.functions.get_hsva_formspec(player, {x=20, y=7})
|
||||
minetest.show_formspec(player:get_player_name(), "colortag", formspec)
|
||||
end
|
||||
})
|
||||
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
if formname == "colortag" then
|
||||
if fields.h or fields.s or fields.v or fields.a then
|
||||
local function sval(value)
|
||||
return solarsail.util.functions.from_slider_hsv(value:gsub(".*:", ""))
|
||||
end
|
||||
local h, s, v, a =
|
||||
sval(fields.h),
|
||||
sval(fields.s),
|
||||
sval(fields.v),
|
||||
sval(fields.a)
|
||||
|
||||
local r, g, b, a = solarsail.util.functions.hsv_rgba(h, s, v, a)
|
||||
|
||||
-- Use temporary/clipboard memory
|
||||
solarsail.color.rgba[player:get_player_name()] = {r=r, g=g, b=b, a=a}
|
||||
|
||||
local formspec = "formspec_version[1]"..
|
||||
"size[20, 10;false]"..
|
||||
"position[0.5, 0.5]"..
|
||||
"bgcolor[#00000000;neither]"..
|
||||
"real_coordinates[true]" ..
|
||||
"background9[9.5,4.5;6,6.05;solarsail_nineslice_1.png;false;2,2]"
|
||||
formspec = formspec .. solarsail.util.functions.get_hsva_formspec(player, {x=20, y=7})
|
||||
minetest.show_formspec(player:get_player_name(), "colortag", formspec)
|
||||
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
-- Set default color to white:
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
solarsail.color.rgba[player:get_player_name()] = {r=255, g=0, b=0, a=255}
|
||||
end)
|
|
@ -0,0 +1,140 @@
|
|||
-- SolarSail Engine Texture, Model Attachment Handling:
|
||||
-- Author: Jordach
|
||||
-- License: Reserved
|
||||
|
||||
--[[ solarsail.fashion.clothing[player]
|
||||
|
||||
Clothing in the solarsail engine is defined as the following internal format;
|
||||
it does not have to follow the named table entries listed, as it is a named table;
|
||||
but should be used for people attempting to make their own game.
|
||||
|
||||
solarsail.fashion.clothing[player] = {
|
||||
body_lower = {}
|
||||
body_upper = {}
|
||||
arms_lower = {}
|
||||
arms_upper = {}
|
||||
legs_lower = {}
|
||||
legs_upper = {}
|
||||
face = {}
|
||||
}
|
||||
|
||||
All tables inside solarsail.fashion.clothing[player] follow the same format, which is as follows:
|
||||
Note: These are INTEGER INDEXED.
|
||||
|
||||
body_lower = {
|
||||
[1] = {
|
||||
texture = "texture_here.png",
|
||||
color = "#rrggbbaa" or {r=255, g=255, b=255, a=255} (Colorspec.)
|
||||
},
|
||||
[34] = {
|
||||
texture = "another_texture.png",
|
||||
color = "#deadbeef"
|
||||
}
|
||||
}
|
||||
|
||||
]]
|
||||
|
||||
--[[ solarsail.fashion.base[player]
|
||||
|
||||
Basic things like eyes, eyebrows, skin colour, etc, and is defined in this manner;
|
||||
it does not have to follow the named table entries listed, as it is a named table;
|
||||
but should be used for people attempting to make their own game.
|
||||
|
||||
solarsail.fashion.base[player] = {
|
||||
eyes = {
|
||||
eye_left_texture = "eyes.png",
|
||||
eye_left_texture_alt = "eyes_alt.png",
|
||||
eye_left_color = "#rrggbbaa" or {r=255, g=255, b=255, a=255} (Colorspec.)
|
||||
eye_left_color_alt = "#rrggbbaa" or {r=255, g=255, b=255, a=255} (Colorspec.)
|
||||
eye_right_texture = "eyes_right.png",
|
||||
eye_right_texture_alt = "eyes_right_alt.png",
|
||||
eye_right_color = "#rrggbbaa" or {r=255, g=255, b=255, a=255} (Colorspec.)
|
||||
eye_right_color_alt = "#rrggbbaa" or {r=255, g=255, b=255, a=255} (Colorspec.)
|
||||
}
|
||||
body = {
|
||||
skin = "skin_texture.png",
|
||||
skin_color = "#rrggbbaa" or {r=255, g=255, b=255, a=255} (Colorspec.)
|
||||
pattern = "fur_pattern.png",
|
||||
pattern_color = "#rrggbbaa" or {r=255, g=255, b=255, a=255} (Colorspec.)
|
||||
}
|
||||
}
|
||||
|
||||
]]
|
||||
|
||||
--[[ solarsail.fashion.attachments[player]
|
||||
|
||||
|
||||
]]
|
||||
|
||||
--[[ solarsail.fashion.get_texture(player_ref)
|
||||
|
||||
Returns the texture of the player.
|
||||
|
||||
Expected return values as strings:
|
||||
|
||||
"player_texture.png"
|
||||
"(player_skin.png^[multiply:#123456)^(player_clothing.png^[multiply:#654321)"
|
||||
|
||||
Define this function if you want to use solarsail.fashion.
|
||||
]]
|
||||
|
||||
function solarsail.fashion.get_texture()
|
||||
end
|
||||
|
||||
--[[ solarsail.fashion.set_default_texture(player_ref)
|
||||
|
||||
Constructs a default skin for the player and sets their skin to it,
|
||||
as long as save data isn't found.
|
||||
|
||||
Define this function if you want to use solarsail.fashion.
|
||||
]]
|
||||
|
||||
function solarsail.fashion.set_default_texture()
|
||||
end
|
||||
|
||||
--[[ solarsail.fashion.check_valid_textures(mod_path, files, start_value, metadata)
|
||||
|
||||
mod_path = minetest.get_modpath("your_mod")
|
||||
filename = "texture_string_"
|
||||
metadata = bool
|
||||
|
||||
Note: filename should leave out any extras like digits and filenames.
|
||||
|
||||
start_value = integer
|
||||
|
||||
Returns: table of filenames, number of files.
|
||||
]]
|
||||
|
||||
function solarsail.fashion.check_valid_textures(mod_path, filename, start_value, metadata)
|
||||
local increment = start_value
|
||||
if start_value == nil then start_value = 1 end
|
||||
local valid_files = {}
|
||||
local metadata = {}
|
||||
while true do
|
||||
local file = io.open(mod_path .. "/textures/" .. filename .. increment .. ".png")
|
||||
if not file then break end
|
||||
-- Add to return list of files
|
||||
table.insert(valid_files, increment, filename .. increment .. ".png")
|
||||
file:close()
|
||||
table.insert(metadata, increment, metadata_scan(mod_path, filename, increment))
|
||||
increment = increment + 1
|
||||
end
|
||||
return increment, valid_files
|
||||
end
|
||||
|
||||
local function metadata_scan(modpath, filename, increment)
|
||||
local metainfo = {}
|
||||
local file = io.open(mod_path .. "/metadata/" .. filename .. increment .. ".tex")
|
||||
if not file then
|
||||
metainfo[1] = "Unknown Author"
|
||||
metainfo[2] = "Unknown"
|
||||
else
|
||||
local metainc = 1
|
||||
for line in io.lines(file) do
|
||||
if metainc > 2 then break end
|
||||
metainfo[metainc] = line
|
||||
metainc = metainc + 1
|
||||
end
|
||||
end
|
||||
return metainfo
|
||||
end
|
|
@ -53,7 +53,7 @@ formname:
|
|||
formname[7] = "mod_yourresponse", used by minetest.register_on_player_receive_fields()
|
||||
|
||||
--]]
|
||||
function solarsail.hud.render_chat(player_ref, state, hud_theme, portrait, name, message, formname)
|
||||
function solarsail.hud.render_chat(player_ref, state, escaped, hud_theme, portrait, name, message, formname)
|
||||
-- Keep a copy of last used in case of nil arguments
|
||||
if hud_theme ~= nil then solarsail.hud.active_chat.theme[player_ref:get_player_name()] = hud_theme end
|
||||
if message ~= nil then solarsail.hud.active_chat.message[player_ref:get_player_name()] = message end
|
||||
|
@ -62,7 +62,7 @@ function solarsail.hud.render_chat(player_ref, state, hud_theme, portrait, name,
|
|||
if formname ~= nil then solarsail.hud.active_chat.formname[player_ref:get_player_name()] = formname end
|
||||
-- Build initial formspec:
|
||||
local formspec = "formspec_version[1]"..
|
||||
"size[8, 2;false]"..
|
||||
"size[8, 2.75;false]"..
|
||||
"position[0.5, 0.8]"..
|
||||
"container[1.25,0]" ..
|
||||
"bgcolor[#00000000;neither]"..
|
||||
|
@ -109,13 +109,37 @@ function solarsail.hud.render_chat(player_ref, state, hud_theme, portrait, name,
|
|||
end
|
||||
end
|
||||
|
||||
-- Render hypertext chat to the main formspec
|
||||
formspec = formspec .. "hypertext[0.15, 1.35;8, 2;solarsail_chat;" ..
|
||||
minetest.formspec_escape(solarsail.hud.active_chat.message[player_ref:get_player_name()][state]) .."]"
|
||||
-- Render hypertext chat to the main formspec as escaped formspecs:
|
||||
if escaped then
|
||||
formspec = formspec .. "hypertext[0.15, 1.45;8, 2;solarsail_chat;" ..
|
||||
minetest.formspec_escape(solarsail.hud.active_chat.message[player_ref:get_player_name()][state]) .."]"
|
||||
else -- Kind of dangerous but we'll roll with it.
|
||||
formspec = formspec .. "hypertext[0.15, 1.45;8, 2;solarsail_chat;" ..
|
||||
solarsail.hud.active_chat.message[player_ref:get_player_name()][state] .."]"
|
||||
end
|
||||
|
||||
minetest.show_formspec(
|
||||
player_ref:get_player_name(),
|
||||
solarsail.hud.active_chat.formname[player_ref:get_player_name()][state],
|
||||
formspec .. "container_end[]"
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
-- Retarded engine decisions require more retarded decisions to make it useful:
|
||||
local prepend = "style_type[button;noclip=true]"..
|
||||
"style_type[checkbox;noclip=true]"..
|
||||
"style_type[scrollbar;noclip=true]"..
|
||||
"style_type[table;noclip=true]"..
|
||||
"style_type[textlist;noclip=true]"..
|
||||
"style_type[dropdown;noclip=true]"..
|
||||
"style_type[field;noclip=true]"..
|
||||
"style_type[textarea;noclip=true]"..
|
||||
"style_type[label;noclip=true]"..
|
||||
"style_type[image_button;noclip=true]"..
|
||||
"style_type[item_image_button;noclip=true]"..
|
||||
"style_type[tab_header;noclip=true]"..
|
||||
"style_type[hypertext;noclip=true]"
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
player:set_formspec_prepend(prepend)
|
||||
end)
|
|
@ -13,8 +13,10 @@ solarsail.player = {}
|
|||
solarsail.npc = {}
|
||||
solarsail.battle = {}
|
||||
solarsail.hud = {}
|
||||
solarsail.save_data = minetest.get_mod_storage()
|
||||
solarsail.cosmetic = {}
|
||||
solarsail.color = {}
|
||||
solarsail.util = {}
|
||||
solarsail.util.clipboard = {}
|
||||
solarsail.util.functions = {}
|
||||
|
||||
-- Handle flat mapgen, for building a world
|
||||
|
@ -25,14 +27,18 @@ minetest.register_node("solarsail:wireframe", {
|
|||
groups = {debug=1}
|
||||
})
|
||||
|
||||
minetest.register_alias("mapgen_stone", "solarsail:wireframe")
|
||||
minetest.register_alias("mapgen_grass", "solarsail:wireframe")
|
||||
minetest.register_alias("mapgen_water_source", "solarsail:wireframe")
|
||||
minetest.register_alias("mapgen_river_water_source", "solarsail:wireframe")
|
||||
--minetest.register_alias("mapgen_stone", "solarsail:wireframe")
|
||||
--minetest.register_alias("mapgen_grass", "solarsail:wireframe")
|
||||
--minetest.register_alias("mapgen_water_source", "solarsail:wireframe")
|
||||
--minetest.register_alias("mapgen_river_water_source", "solarsail:wireframe")
|
||||
|
||||
-- Sava data handling (per-player):
|
||||
|
||||
--dofile(minetest.get_modpath("solarsail").."/save.lua")
|
||||
dofile(minetest.get_modpath("solarsail").."/save.lua")
|
||||
|
||||
-- HSVA->RGBA->HSVA handling:
|
||||
|
||||
dofile(minetest.get_modpath("solarsail").."/colour.lua")
|
||||
|
||||
-- HUD rendering and formspec handling:
|
||||
|
||||
|
@ -44,7 +50,7 @@ dofile(minetest.get_modpath("solarsail").."/hud.lua")
|
|||
|
||||
-- Start skybox engine:
|
||||
|
||||
dofile(minetest.get_modpath("solarsail").."/skybox.lua")
|
||||
--dofile(minetest.get_modpath("solarsail").."/skybox.lua")
|
||||
|
||||
-- Control handling for HUDs, player entity, etc:
|
||||
|
||||
|
@ -54,7 +60,7 @@ dofile(minetest.get_modpath("solarsail").."/control.lua")
|
|||
|
||||
dofile(minetest.get_modpath("solarsail").."/player.lua")
|
||||
|
||||
-- NPC functionality, chat systems;
|
||||
-- Basic, advanced NPC AI;
|
||||
|
||||
--dofile(minetest.get_modpath("solarsail").."/npc.lua")
|
||||
|
||||
|
|
|
@ -69,8 +69,8 @@ function solarsail.player.set_model(player_ref, model_name, anim, framerate,
|
|||
|
||||
-- Construct a player entity at the player's position:
|
||||
local pos = player_ref:get_pos()
|
||||
local entity = minetest.add_entity(pos, model_name)
|
||||
solarsail.player.model.entity_ref[player_ref:get_player_name()] = entity
|
||||
solarsail.player.model.entity_ref[player_ref:get_player_name()] = minetest.add_entity(pos, model_name)
|
||||
|
||||
-- Get LuaObject:
|
||||
local entity_lua = solarsail.player.model.entity_ref[player_ref:get_player_name()]:get_luaentity()
|
||||
|
||||
|
@ -95,10 +95,19 @@ function solarsail.player.set_model(player_ref, model_name, anim, framerate,
|
|||
player_ref:set_attach(entity_lua.object, attach_bone, relative_pos, relative_rotation)
|
||||
end
|
||||
|
||||
function solarsail.player.set_properties(player_ref, entity_properties)
|
||||
solarsail.player.model.entity_ref[player_ref:get_player_name()]:set_properties()
|
||||
-- Wrapper for Lua_SAO:set_properties()
|
||||
function solarsail.player.set_properties(player_name, changes)
|
||||
solarsail.player.model.entity_ref[player_name]:set_properties(changes)
|
||||
end
|
||||
|
||||
-- Wrapper for Lua_SAO:get_properties()
|
||||
function solarsail.player.get_properties(player_name)
|
||||
return solarsail.player.model.entity_ref[player_name]:get_properties()
|
||||
end
|
||||
|
||||
--store PI for quicker use:
|
||||
local pi = math.pi
|
||||
|
||||
-- Supply a boolean value to go backwards, otherwise, forwards
|
||||
function solarsail.util.functions.yaw_to_vec(rads, mult, backwards)
|
||||
local z = math.cos(rads) * mult
|
||||
|
@ -112,9 +121,9 @@ end
|
|||
|
||||
-- Get left or right direction, supply a boolean to go left.
|
||||
function solarsail.util.functions.yaw_to_vec_side(rads, mult, left)
|
||||
local nrads = rads + math.pi/2
|
||||
local nrads = rads + pi/2
|
||||
if left then
|
||||
nrads = rads - math.pi/2
|
||||
nrads = rads - pi/2
|
||||
end
|
||||
local x = (math.cos(nrads) * -1) * mult
|
||||
local z = math.sin(nrads) * mult
|
||||
|
@ -123,12 +132,10 @@ end
|
|||
|
||||
-- Convert our x, z vectors to a nice radian:
|
||||
function solarsail.util.functions.vec_to_rad(x, z)
|
||||
local nx = x - 0
|
||||
local nz = z - 0
|
||||
return math.atan2(nz, nx)
|
||||
return math.atan2(z, x)
|
||||
end
|
||||
|
||||
-- Quickly convert degrees to radians:
|
||||
function solarsail.util.functions.deg_to_rad(deg)
|
||||
return deg * (3.142/180)
|
||||
return deg * (pi/180)
|
||||
end
|
|
@ -0,0 +1,21 @@
|
|||
-- SolarSail Engine Sava Data Handling:
|
||||
-- Author: Jordach
|
||||
-- License: Reserved
|
||||
|
||||
solarsail.save_data = minetest.get_mod_storage()
|
||||
solarsail.game = {}
|
||||
|
||||
--[[ solarsail.game.save()
|
||||
|
||||
Saves all game data to disk, includes other players connected to the server.
|
||||
]]
|
||||
|
||||
--[[ solarsail.game.set_spawn(player, pos)
|
||||
|
||||
Set's a players world location. Used on connection
|
||||
in multiplayer mode and when loading a save in singleplayer.
|
||||
|
||||
If pos is set to nil it will use player:get_pos(). However,
|
||||
if a pos table is supplied in {x=0 , y=0, z=0} format,
|
||||
it will use that instead of the player's current position.s
|
||||
]]
|
|
@ -14,24 +14,7 @@ solarsail.skybox.regions.skybox = {}
|
|||
solarsail.skybox.skybox_defs = {}
|
||||
solarsail.skybox.cloud_defs = {}
|
||||
|
||||
--[[ solarsail.skybox.register_region(skybox_name, position_1, position_2)
|
||||
|
||||
API spec for changing the skybox based on position:
|
||||
|
||||
skybox_name = "name_of_skybox"
|
||||
position_1 = {x = 1, y = 0, z = 0}
|
||||
position_2 = {x = -1, y = 1, z = 10}
|
||||
|
||||
Note: Preferrably as game_skyboxname or mod_skyboxname
|
||||
]]--
|
||||
|
||||
function solarsail.skybox.register_region(skybox_name, position_1, position_2)
|
||||
solarsail.skybox.regions.pos_1[skybox_name] = position_1
|
||||
solarsail.skybox.regions.pos_2[skybox_name] = position_2
|
||||
solarsail.skybox.regions.skybox[skybox_name] = skybox_name
|
||||
end
|
||||
|
||||
--[[ solarsail.skybox.register_skybox(skybox_name, skybox_defs, cloud_defs)
|
||||
--[[ solarsail.skybox.register_skybox(skybox_name, skybox_defs, cloud_defs, pos_1, pos_2)
|
||||
|
||||
API spec for registering clouds based on position:
|
||||
|
||||
|
@ -50,12 +33,18 @@ cloud_defs table:
|
|||
cloud_defs.x = -128 to 128
|
||||
cloud_defs.y = -128 to 128
|
||||
|
||||
position_1 = {x = 1, y = 0, z = 0}
|
||||
position_2 = {x = -1, y = 1, z = 10}
|
||||
|
||||
Note: Preferrably as game_skyboxname or mod_skyboxname
|
||||
]]--
|
||||
|
||||
function solarsail.skybox.register_skybox(skybox_name, skybox_defs, cloud_defs)
|
||||
function solarsail.skybox.register_skybox(skybox_name, skybox_defs, cloud_defs, pos_1, pos_2)
|
||||
solarsail.skybox.skybox_defs[skybox_name] = skybox_defs
|
||||
solarsail.skybox.cloud_defs[skybox_name] = cloud_defs
|
||||
solarsail.skybox.regions.pos_1[skybox_name] = pos_1
|
||||
solarsail.skybox.regions.pos_2[skybox_name] = pos_2
|
||||
solarsail.skybox.regions.skybox[skybox_name] = skybox_name
|
||||
end
|
||||
|
||||
--[[ solarsail.skybox.override_skybox(skybox_defs, cloud_defs, player)
|
||||
|
@ -238,17 +227,16 @@ minetest.register_on_leaveplayer(function(player)
|
|||
player_count = player_count - 1
|
||||
end)
|
||||
|
||||
solarsail.skybox.register_skybox("paramat_theory",
|
||||
solarsail.skybox.register_skybox("default",
|
||||
{
|
||||
bgcolor = {r = 0, g = 0, b = 0, a = 0},
|
||||
type = "plain",
|
||||
textures = {},
|
||||
clouds = false
|
||||
-- ["top"] = "#676891", ["bottom"] = "#c79161", ["base"] = "#a17268", ["light"] = 0.15} sunrise = #ffae5f horizon = #404164
|
||||
bgcolor = "#a17268",
|
||||
type = "regular",
|
||||
clouds = true
|
||||
},
|
||||
{
|
||||
density = 0.34
|
||||
},
|
||||
{}
|
||||
)
|
||||
|
||||
solarsail.skybox.register_region("paramat_theory",
|
||||
{
|
||||
x = -31000,
|
||||
y = -31000,
|
||||
|
@ -259,4 +247,4 @@ solarsail.skybox.register_region("paramat_theory",
|
|||
y = 31000,
|
||||
z = 31000
|
||||
}
|
||||
)
|
||||
)
|
||||
|
|
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 7.1 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 4.6 KiB |
Before Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 240 B |
Before Width: | Height: | Size: 238 B |
Before Width: | Height: | Size: 233 B |
Before Width: | Height: | Size: 236 B |
Before Width: | Height: | Size: 231 B |
Before Width: | Height: | Size: 230 B |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 198 B |
After Width: | Height: | Size: 221 B |
After Width: | Height: | Size: 220 B |
|
@ -0,0 +1,467 @@
|
|||
-- Minetest Bullshit
|
||||
|
||||
minetest.register_alias("mapgen_stone", "core:stone_4")
|
||||
minetest.register_alias("mapgen_dirt", "core:dirt_4")
|
||||
minetest.register_alias("mapgen_dirt_with_grass", "core:grass_4")
|
||||
minetest.register_alias("mapgen_sand", "core:sand_4")
|
||||
minetest.register_alias("mapgen_water_source", "core:water_source")
|
||||
minetest.register_alias("mapgen_river_water_source", "core:water_source")
|
||||
minetest.register_alias("mapgen_gravel", "core:gravel_4")
|
||||
minetest.register_alias("mapgen_dirt_with_snow", "core:grass_snow_4")
|
||||
minetest.register_alias("mapgen_snowblock", "core:snowblock_4")
|
||||
minetest.register_alias("mapgen_snow", "core:snow_4")
|
||||
minetest.register_alias("mapgen_ice", "core:ice_4")
|
||||
|
||||
-- Mapgen Specific:
|
||||
|
||||
minetest.register_node(":core:mg_oak_sapling", {
|
||||
description = "Impossible to get node.",
|
||||
drawtype = "airlike",
|
||||
paramtype = "light",
|
||||
groups = {not_in_creative_inventory=1},
|
||||
})
|
||||
|
||||
minetest.register_node(":core:mg_pine_sapling", {
|
||||
description = "Impossible to get node.",
|
||||
drawtype = "airlike",
|
||||
paramtype = "light",
|
||||
groups = {not_in_creative_inventory=1},
|
||||
})
|
||||
|
||||
minetest.register_node(":core:mg_pine_snowy_sapling", {
|
||||
description = "Impossible to get node.",
|
||||
drawtype = "airlike",
|
||||
paramtype = "light",
|
||||
groups = {not_in_creative_inventory=1},
|
||||
})
|
||||
|
||||
minetest.register_node(":core:water_source", {
|
||||
description = "Water Source (Can Self Replish)",
|
||||
drawtype = "liquid",
|
||||
tiles = {
|
||||
{
|
||||
name = "core_water_source_animated.png",
|
||||
animation = {
|
||||
type = "vertical_frames",
|
||||
aspect_w = 16,
|
||||
aspect_h = 16,
|
||||
length = 1.5,
|
||||
},
|
||||
},
|
||||
},
|
||||
special_tiles = {
|
||||
{
|
||||
name = "core_water_source_animated.png",
|
||||
animation = {
|
||||
type = "vertical_frames",
|
||||
aspect_w = 16,
|
||||
aspect_h = 16,
|
||||
length = 1.5,
|
||||
},
|
||||
backface_culling = true,
|
||||
},
|
||||
},
|
||||
--alpha = 153,
|
||||
use_texture_alpha = true,
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
pointable = false,
|
||||
diggable = false,
|
||||
buildable_to = true,
|
||||
is_ground_content = false,
|
||||
drop = "",
|
||||
drowning = 1,
|
||||
liquidtype = "source",
|
||||
liquid_alternative_flowing = "core:water_flowing",
|
||||
liquid_alternative_source = "core:water_source",
|
||||
liquid_viscosity = 1,
|
||||
post_effect_color = {a = 153, r = 18, g = 78, b = 137},
|
||||
groups = {water = 3, source = 1, puts_out_fire = 1, can_grow = 1},
|
||||
})
|
||||
|
||||
minetest.register_node(":core:water_flowing", {
|
||||
description = "Flowing Water",
|
||||
drawtype = "flowingliquid",
|
||||
tiles = {"core_water.png"},
|
||||
special_tiles = {
|
||||
{
|
||||
name = "core_water_flowing_animated.png",
|
||||
backface_culling = true,
|
||||
animation = {
|
||||
type = "vertical_frames",
|
||||
aspect_w = 16,
|
||||
aspect_h = 16,
|
||||
length = 0.8,
|
||||
},
|
||||
},
|
||||
{
|
||||
name = "core_water_flowing_animated.png",
|
||||
backface_culling = true,
|
||||
animation = {
|
||||
type = "vertical_frames",
|
||||
aspect_w = 16,
|
||||
aspect_h = 16,
|
||||
length = 0.8,
|
||||
},
|
||||
},
|
||||
},
|
||||
--alpha = 153,
|
||||
use_texture_alpha = true,
|
||||
paramtype = "light",
|
||||
paramtype2 = "flowingliquid",
|
||||
walkable = false,
|
||||
pointable = false,
|
||||
diggable = false,
|
||||
buildable_to = true,
|
||||
is_ground_content = false,
|
||||
drop = "",
|
||||
drowning = 1,
|
||||
liquidtype = "flowing",
|
||||
liquid_alternative_flowing = "core:water_flowing",
|
||||
liquid_alternative_source = "core:water_source",
|
||||
liquid_viscosity = 1,
|
||||
post_effect_color = {a = 153, r = 18, g = 78, b = 137},
|
||||
groups = {water = 3, flowing = 1, puts_out_fire = 1, can_grow = 1, not_in_creative_inventory = 1},
|
||||
})
|
||||
|
||||
-- Grasses:
|
||||
|
||||
for i=1, 3 do
|
||||
minetest.register_node(":core:longgrass_"..i, {
|
||||
tiles = {"core_long_grass_"..i..".png"},
|
||||
waving = 1,
|
||||
drawtype = "plantlike",
|
||||
paramtype = "light",
|
||||
paramtype2 = "meshoptions",
|
||||
visual_scale = 1.0,
|
||||
walkable = false,
|
||||
buildable_to = true,
|
||||
sunlight_propagates = true,
|
||||
groups = {attached_node=1},
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
|
||||
},
|
||||
--sounds = mcore.sound_plants,
|
||||
})
|
||||
end
|
||||
|
||||
function weapons.register_block(name, params)
|
||||
local n_tiles_3 = {}
|
||||
local n_tiles_2 = {}
|
||||
local n_tiles_1 = {}
|
||||
|
||||
for k, v in pairs(params.tiles) do
|
||||
n_tiles_3[k] = v .. "^core_block_health_3.png"
|
||||
n_tiles_2[k] = v .. "^core_block_health_2.png"
|
||||
n_tiles_1[k] = v .. "^core_block_health_1.png"
|
||||
end
|
||||
|
||||
local n_params_4 = table.copy(params)
|
||||
local n_params_3 = table.copy(params)
|
||||
local n_params_2 = table.copy(params)
|
||||
local n_params_1 = table.copy(params)
|
||||
|
||||
n_params_3.tiles = n_tiles_3
|
||||
n_params_2.tiles = n_tiles_2
|
||||
n_params_1.tiles = n_tiles_1
|
||||
|
||||
n_params_4._health = 4
|
||||
n_params_3._health = 3
|
||||
n_params_2._health = 2
|
||||
n_params_1._health = 1
|
||||
|
||||
n_params_4._name = name
|
||||
n_params_3._name = name
|
||||
n_params_2._name = name
|
||||
n_params_1._name = name
|
||||
|
||||
n_params_1.groups = {falling_node=1}
|
||||
n_params_2.groups = {falling_node=1}
|
||||
|
||||
minetest.register_node(":"..name.."_4", n_params_4)
|
||||
minetest.register_node(":"..name.."_3", n_params_3)
|
||||
minetest.register_node(":"..name.."_2", n_params_2)
|
||||
minetest.register_node(":"..name.."_1", n_params_1)
|
||||
end
|
||||
|
||||
-- Game blocks:
|
||||
|
||||
weapons.register_block("core:dirt", {
|
||||
tiles = {"core_dirt.png"},
|
||||
is_ground_content = true,
|
||||
--sounds = weapons.sound_dirt,
|
||||
})
|
||||
|
||||
weapons.register_block("core:grass", {
|
||||
tiles = {"core_grass.png", "core_dirt.png", "core_dirt.png^core_grass_side.png"},
|
||||
is_ground_content = true,
|
||||
--sounds = weapons.sound_dirt,
|
||||
})
|
||||
|
||||
weapons.register_block("core:grass_snow", {
|
||||
tiles = {"core_snow.png", "core_dirt.png", "core_dirt.png^core_snow_side.png"},
|
||||
is_ground_content = true,
|
||||
--sounds = weapons.sound_dirt,
|
||||
})
|
||||
|
||||
weapons.register_block("core:sand", {
|
||||
tiles = {"core_sand.png"},
|
||||
is_ground_content = true,
|
||||
groups = {falling_node=1},
|
||||
--sounds = weapons.sound_sand,
|
||||
})
|
||||
|
||||
weapons.register_block("core:gravel", {
|
||||
tiles = {"core_gravel.png"},
|
||||
is_ground_content = true,
|
||||
groups = {falling_node=1},
|
||||
--sounds = weapons.sound_gravel,
|
||||
})
|
||||
|
||||
weapons.register_block("core:snow", {
|
||||
tiles = {"core_snow.png"},
|
||||
paramtype = "light",
|
||||
buildable_to = true,
|
||||
floodable = true,
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, -0.2, 0.5},
|
||||
},
|
||||
},
|
||||
walkable = false,
|
||||
is_ground_content = true,
|
||||
groups = {falling_node=1},
|
||||
--sounds = weapons.sound_snow,
|
||||
})
|
||||
|
||||
weapons.register_block("core:snowblock", {
|
||||
tiles = {"core_snow.png"},
|
||||
is_ground_content = true,
|
||||
--sounds = weapons.sound_snow,
|
||||
})
|
||||
|
||||
weapons.register_block("core:ice", {
|
||||
tiles = {"core_ice.png"},
|
||||
is_ground_content = true,
|
||||
paramtype = "light",
|
||||
--sounds = weapons.sound_glass,
|
||||
})
|
||||
|
||||
weapons.register_block("core:stone", {
|
||||
tiles = {"core_stone.png"},
|
||||
is_ground_content = true,
|
||||
--sounds = weapons.sound_stone,
|
||||
})
|
||||
|
||||
weapons.register_block("core:cobble", {
|
||||
tiles = {"core_cobble.png"},
|
||||
is_ground_content = true,
|
||||
--sounds = weapons.sound_stone,
|
||||
})
|
||||
|
||||
weapons.register_block("core:mossycobble", {
|
||||
tiles = {"core_cobble_mossy.png"},
|
||||
is_ground_content = true,
|
||||
--sounds = weapons.sound_stone,
|
||||
})
|
||||
|
||||
weapons.register_block("core:azan_log", {
|
||||
tiles = {"core_azan_log_top.png", "core_azan_log_top.png", "core_azan_log.png"},
|
||||
--sounds = weapons.sound_wood,
|
||||
})
|
||||
|
||||
weapons.register_block("core:azan_leaves", {
|
||||
tiles = {"core_azan_leaves.png"},
|
||||
drawtype = "allfaces_optional",
|
||||
waving = 1,
|
||||
paramtype = "light",
|
||||
--sounds = weapons.sound_plants,
|
||||
})
|
||||
|
||||
weapons.register_block("core:reiz_log", {
|
||||
tiles = {"core_reiz_log_top.png", "core_reiz_log_top.png", "core_reiz_log.png"},
|
||||
--sounds = weapons.sound_wood,
|
||||
})
|
||||
|
||||
weapons.register_block("core:reiz_needles", {
|
||||
tiles = {"core_reiz_needles.png"},
|
||||
drawtype = "allfaces_optional",
|
||||
waving = 1,
|
||||
paramtype = "light",
|
||||
--sounds = weapons.sound_plants,
|
||||
})
|
||||
|
||||
weapons.register_block("core:reiz_needles_snowy", {
|
||||
tiles = {"core_reiz_needles_snowy.png"},
|
||||
drawtype = "allfaces_optional",
|
||||
waving = 1,
|
||||
paramtype = "light",
|
||||
--sounds = weapons.sound_plants,
|
||||
})
|
||||
|
||||
weapons.register_block("core:team_red", {
|
||||
tiles = {"core_team_red.png"},
|
||||
--sounds = weapons.sound_wood
|
||||
})
|
||||
|
||||
weapons.register_block("core:team_blue", {
|
||||
tiles = {"core_team_blue.png"},
|
||||
--sounds = weapons.sound_wood
|
||||
})
|
||||
|
||||
weapons.register_block("core:lamp_red", {
|
||||
tiles = {"core_lamp_red.png"},
|
||||
paramtype = "light",
|
||||
light_source = 14
|
||||
})
|
||||
|
||||
weapons.register_block("core:lamp_blue", {
|
||||
tiles = {"core_lamp_blue.png"},
|
||||
paramtype = "light",
|
||||
light_source = 14
|
||||
})
|
||||
|
||||
weapons.register_block("core:slab_red", {
|
||||
tiles = {"core_team_red.png"},
|
||||
paramtype = "light",
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
weapons.register_block("core:slab_blue", {
|
||||
tiles = {"core_team_blue.png"},
|
||||
paramtype = "light",
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_node(":core:base_block", {
|
||||
tiles = {"core_neutral.png"},
|
||||
_takes_damage = false
|
||||
})
|
||||
|
||||
minetest.register_node(":core:base_door", {
|
||||
walkable = false,
|
||||
paramtype = "light",
|
||||
pointable = false,
|
||||
drawtype = "airlike",
|
||||
_takes_damage = false,
|
||||
sunlight_propagates = true,
|
||||
--tiles = {"core_azan_leaves.png"},
|
||||
--drawtype = "allfaces_optional",
|
||||
})
|
||||
|
||||
local function rotate_and_place(itemstack, placer, pointed_thing)
|
||||
local p0 = pointed_thing.under
|
||||
local p1 = pointed_thing.above
|
||||
local param2 = 0
|
||||
|
||||
if placer then
|
||||
local placer_pos = placer:get_pos()
|
||||
if placer_pos then
|
||||
param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos))
|
||||
end
|
||||
|
||||
local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing)
|
||||
local fpos = finepos.y % 1
|
||||
|
||||
if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5)
|
||||
or (fpos < -0.5 and fpos > -0.999999999) then
|
||||
param2 = param2 + 20
|
||||
if param2 == 21 then
|
||||
param2 = 23
|
||||
elseif param2 == 23 then
|
||||
param2 = 21
|
||||
end
|
||||
end
|
||||
end
|
||||
return minetest.item_place(itemstack, placer, pointed_thing, param2)
|
||||
end
|
||||
|
||||
minetest.register_node(":core:base_slab", {
|
||||
_takes_damage = false,
|
||||
tiles = {"core_neutral.png"},
|
||||
paramtype = "light",
|
||||
drawtype = "nodebox",
|
||||
paramtype2 = "facedir",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||
},
|
||||
},
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
local under = minetest.get_node(pointed_thing.under)
|
||||
local wield_item = itemstack:get_name()
|
||||
local player_name = placer and placer:get_player_name() or ""
|
||||
local creative_enabled = (creative and creative.is_enabled_for
|
||||
and creative.is_enabled_for(player_name))
|
||||
|
||||
if under and under.name:find("^stairs:slab_") then
|
||||
-- place slab using under node orientation
|
||||
local dir = minetest.dir_to_facedir(vector.subtract(
|
||||
pointed_thing.above, pointed_thing.under), true)
|
||||
|
||||
local p2 = under.param2
|
||||
|
||||
-- Placing a slab on an upside down slab should make it right-side up.
|
||||
if p2 >= 20 and dir == 8 then
|
||||
p2 = p2 - 20
|
||||
-- same for the opposite case: slab below normal slab
|
||||
elseif p2 <= 3 and dir == 4 then
|
||||
p2 = p2 + 20
|
||||
end
|
||||
|
||||
-- else attempt to place node with proper param2
|
||||
minetest.item_place_node(ItemStack(wield_item), placer, pointed_thing, p2)
|
||||
if not creative_enabled then
|
||||
itemstack:take_item()
|
||||
end
|
||||
return itemstack
|
||||
else
|
||||
return rotate_and_place(itemstack, placer, pointed_thing)
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_node(":core:base_stair", {
|
||||
_takes_damage = false,
|
||||
tiles = {"core_neutral.png"},
|
||||
paramtype = "light",
|
||||
drawtype = "nodebox",
|
||||
paramtype2 = "facedir",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
||||
{-0.5, 0, 0, 0.5, 0.5, 0.5},
|
||||
},
|
||||
},
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
if pointed_thing.type ~= "node" then
|
||||
return itemstack
|
||||
end
|
||||
|
||||
return rotate_and_place(itemstack, placer, pointed_thing)
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_node(":core:base_lamp", {
|
||||
_takes_damage = false,
|
||||
tiles = {"core_neutral_lamp.png"},
|
||||
paramtype = "light",
|
||||
light_source = 14
|
||||
})
|
|
@ -0,0 +1 @@
|
|||
solarsail
|
|
@ -0,0 +1,199 @@
|
|||
local entity_flag_blue = {
|
||||
visual = "mesh",
|
||||
textures = {
|
||||
"flag_blue.png"
|
||||
},
|
||||
mesh = "flag.obj",
|
||||
physical = true,
|
||||
collide_with_objects = false,
|
||||
pointable = false,
|
||||
collisionbox = {-0.3, 0, -0.3, 0.3, 2, 0.3},
|
||||
|
||||
_set_waypoint = false,
|
||||
_timer = -1,
|
||||
_carried_by = nil,
|
||||
_is_held = false,
|
||||
_updated_waypoint = false,
|
||||
_team = "blue",
|
||||
_booted = true,
|
||||
_x = 0,
|
||||
_y = 0,
|
||||
_z = 0
|
||||
}
|
||||
|
||||
function entity_flag_blue:alert_team(self)
|
||||
for _, player in ipairs(minetest.get_connected_players()) do
|
||||
local pname = player:get_player_name()
|
||||
if self._team == weapons.player_list[pname].team then
|
||||
minetest.chat_send_player(pname,
|
||||
self._carried_by:get_player_name() .. " has picked up your flag.")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function entity_flag_blue:attach_to_player(self, player)
|
||||
if player:get_wielded_item().name == "weapons:flag_red" then return end
|
||||
weapons.remove_global_waypoint("blue_flag")
|
||||
self.object:set_attach(player, "Armature_Upper_Body", {x=0,y=0,z=0},{x=0,y=0,z=0})
|
||||
self._carried_by = player
|
||||
self._is_held = true
|
||||
local pname = player:get_player_name()
|
||||
if weapons.player_list[pname].team ~= self._team then
|
||||
self:alert_team(self)
|
||||
end
|
||||
self._set_waypoint = false
|
||||
self._x = 0
|
||||
self._z = 0
|
||||
weapons.clear_inv(player)
|
||||
weapons.add_class_items(player, "blue_flag")
|
||||
weapons.player.cancel_reload(player)
|
||||
end
|
||||
|
||||
function entity_flag_blue:yeet_flag(self, velocityy)
|
||||
self.object:set_detach()
|
||||
local yaw_rad = self._carried_by:get_look_horizontal()
|
||||
local pitch_rad = self._carried_by:get_look_vertical()
|
||||
self._x, self._z =
|
||||
solarsail.util.functions.yaw_to_vec(yaw_rad, 8, false)
|
||||
self._y = (solarsail.util.functions.y_direction(pitch_rad, 10) * -1)
|
||||
local pitch_mult = solarsail.util.functions.xz_amount(pitch_rad)
|
||||
self._x = self._x * (pitch_mult * 1.55)
|
||||
self._z = self._z * (pitch_mult * 1.55)
|
||||
velocityy.y = velocityy.y + self._y
|
||||
self._timer = 1
|
||||
weapons.clear_inv(self._carried_by)
|
||||
weapons.add_class_items(self._carried_by, weapons.player_list[self._carried_by:get_player_name()].class)
|
||||
self._carried_by = nil
|
||||
end
|
||||
|
||||
function entity_flag_blue:flag_captured(self, velocityy)
|
||||
local pname = self._carried_by:get_player_name()
|
||||
self._timer = 5
|
||||
local blu = 147-4
|
||||
local y = weapons.blu_base_y
|
||||
self.object:set_detach()
|
||||
self.object:set_pos({x=-blu, y=y+8.5, z=-blu})
|
||||
velocityy.y = velocityy.y + 1
|
||||
weapons.clear_inv(self._carried_by)
|
||||
weapons.add_class_items(self._carried_by, weapons.player_list[pname].class)
|
||||
self._carried_by = nil
|
||||
minetest.chat_send_all(pname .. " has captured the Red Flag")
|
||||
weapons.score.red = weapons.score.red + 1
|
||||
minetest.chat_send_all("Blue Team: " .. weapons.score.blue)
|
||||
minetest.chat_send_all("Red Team: " .. weapons.score.red)
|
||||
end
|
||||
|
||||
function entity_flag_blue:drop_flag(self, velocityy)
|
||||
self.object:set_detach()
|
||||
weapons.clear_inv(self._carried_by)
|
||||
weapons.add_class_items(self._carried_by, weapons.player_list[self._carried_by:get_player_name()].class)
|
||||
self._carried_by = nil
|
||||
velocityy.y = velocityy.y + 2
|
||||
self._timer = 2
|
||||
end
|
||||
|
||||
function entity_flag_blue:on_step(dtime)
|
||||
-- apply physics
|
||||
local velocityy = self.object:get_velocity()
|
||||
local accel = self.object:get_acceleration()
|
||||
|
||||
if velocityy.y == 0 then
|
||||
-- Handle friction
|
||||
self._x = self._x * 0.75
|
||||
self._z = self._z * 0.75
|
||||
else
|
||||
self._x = self._x * 0.99
|
||||
self._z = self._z * 0.99
|
||||
end
|
||||
|
||||
-- Round down numbers when percentages exponentialise movement:
|
||||
if math.abs(self._x) < 0.01 then self._x = 0 end
|
||||
if math.abs(self._z) < 0.01 then self._z = 0 end
|
||||
|
||||
if not self._is_held then
|
||||
if self._timer < 0.01 then -- fuck the flag being instantly recaptured
|
||||
-- waiting for player to move flag
|
||||
for _, player in ipairs(minetest.get_connected_players()) do
|
||||
local dist = solarsail.util.functions.pos_to_dist(
|
||||
self.object:get_pos(), player:get_pos())
|
||||
if weapons.player_list[player:get_player_name()].team == nil then end
|
||||
if weapons.player_list[player:get_player_name()].hp == nil then -- Ignore invalid players
|
||||
elseif weapons.player_list[player:get_player_name()].hp < 1 then -- Ignore dead players
|
||||
elseif dist < 0.76 then
|
||||
self:attach_to_player(self, player)
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
if self._carried_by ~= nil then
|
||||
local red = 207-35
|
||||
local y = weapons.red_base_y
|
||||
local pname = self._carried_by:get_player_name()
|
||||
local dist_to_cap =
|
||||
solarsail.util.functions.pos_to_dist(self.object:get_pos(),
|
||||
{x=red, y=y-1, z=red})
|
||||
if dist_to_cap < 1 then
|
||||
if not weapons.lock.blue then
|
||||
weapons.lock_blue()
|
||||
self:flag_captured(self, velocityy)
|
||||
end
|
||||
end
|
||||
if solarsail.controls.player[pname].RMB == nil then
|
||||
elseif solarsail.controls.player[pname].RMB then
|
||||
if solarsail.controls.player[pname].sneak == nil then
|
||||
elseif solarsail.controls.player[pname].sneak then
|
||||
self:yeet_flag(self, velocityy)
|
||||
end
|
||||
elseif weapons.player_list[pname].hp < 1 then
|
||||
self:drop_flag(self, velocityy)
|
||||
end
|
||||
end
|
||||
|
||||
if self._timer > 0 then
|
||||
self._timer = self._timer - dtime
|
||||
if self._timer < 0.01 then
|
||||
if self._is_held then
|
||||
self._is_held = false
|
||||
self._carried_by = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
self.object:set_velocity({x=self._x, y=velocityy.y, z=self._z})
|
||||
self.object:set_acceleration({x=0, y=-9.80, z=0})
|
||||
|
||||
if velocityy.x == 0 then
|
||||
if velocityy.z == 0 then
|
||||
if velocityy.y == 0 then
|
||||
if not self._is_held then
|
||||
if not self._set_waypoint then
|
||||
weapons.remove_global_waypoint("blue_flag")
|
||||
local flag_pos = self.object:get_pos()
|
||||
flag_pos.y = flag_pos.y + 2.5
|
||||
weapons.add_global_waypoint(flag_pos, "blue_flag",
|
||||
"Blue Flag", weapons.teams.blue_colour)
|
||||
self._set_waypoint = true
|
||||
end
|
||||
end
|
||||
-- Update flag position for new players:
|
||||
if weapons.update_blue_flag then
|
||||
weapons.remove_global_waypoint("blue_flag")
|
||||
local flag_pos = self.object:get_pos()
|
||||
flag_pos.y = flag_pos.y + 2.5
|
||||
weapons.add_global_waypoint(flag_pos, "blue_flag",
|
||||
"Blue Flag", weapons.teams.blue_colour)
|
||||
weapons.update_blue_flag = false
|
||||
end
|
||||
else
|
||||
if not self._is_held then
|
||||
weapons.remove_global_waypoint("blue_flag")
|
||||
self._set_waypoint = false
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_entity("weapons:flag_blue", entity_flag_blue)
|
|
@ -0,0 +1,187 @@
|
|||
local entity_flag_blue = {
|
||||
visual = "mesh",
|
||||
textures = {
|
||||
"flag_blue.png"
|
||||
},
|
||||
mesh = "flag.obj",
|
||||
physical = true,
|
||||
collide_with_objects = false,
|
||||
pointable = false,
|
||||
collisionbox = {-0.3, 0, -0.3, 0.3, 2, 0.3},
|
||||
|
||||
_set_waypoint = false,
|
||||
_timer = -1,
|
||||
_carried_by = nil,
|
||||
_is_held = false,
|
||||
_updated_waypoint = false,
|
||||
_team = "blue",
|
||||
_booted = true,
|
||||
_x = 0,
|
||||
_y = 0,
|
||||
_z = 0
|
||||
}
|
||||
|
||||
function entity_flag_blue:alert_team()
|
||||
for _, player in ipairs(minetest.get_connected_players()) do
|
||||
local pname = player:get_player_name()
|
||||
if self._team == weapons.player_list[pname].team then
|
||||
minetest.chat_send_player(pname,
|
||||
self._carried_by:get_player_name() .. " has picked up your flag.")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function entity_flag_blue:attach_to_player(player)
|
||||
remove_global_waypoint("blue_flag")
|
||||
self.object:set_attach(player, "", {x=0,y=0,z=0},{x=0,y=0,z=0})
|
||||
self._carried_by = player
|
||||
self._is_held = true
|
||||
local pname = player:get_player_name()
|
||||
if weapons.player_list[pname].team ~= self._team then
|
||||
self:alert_team()
|
||||
end
|
||||
self._set_waypoint = false
|
||||
self._x = 0
|
||||
self._z = 0
|
||||
weapons.clear_inv(player)
|
||||
weapons.add_class_items(player, "blue_flag")
|
||||
weapons.player.cancel_reload(player)
|
||||
end
|
||||
|
||||
function entity_flag_blue:yeet_flag(velocityy)
|
||||
self.object:set_detach()
|
||||
local yaw_rad = self._carried_by:get_look_horizontal()
|
||||
local pitch_rad = self._carried_by:get_look_vertical()
|
||||
self._x, self._z =
|
||||
solarsail.util.functions.yaw_to_vec(yaw_rad, 8, false)
|
||||
self._y = (solarsail.util.functions.y_direction(pitch_rad, 10) * -1)
|
||||
local pitch_mult = solarsail.util.functions.xz_amount(pitch_rad)
|
||||
self._x = self._x * (pitch_mult * 1.55)
|
||||
self._z = self._z * (pitch_mult * 1.55)
|
||||
velocityy.y = velocityy.y + self._y
|
||||
self._timer = 1
|
||||
weapons.clear_inv(self._carried_by)
|
||||
weapons.add_class_items(self._carried_by, weapons.player_list[self._carried_by:get_player_name()].class)
|
||||
self._carried_by = nil
|
||||
end
|
||||
|
||||
function entity_flag_blue:flag_captured(velocityy)
|
||||
local blu = 147
|
||||
local blu2 = 192-42
|
||||
local y = minetest.get_spawn_level(-blu2, -blu2)
|
||||
self.object:set_detach()
|
||||
self.object:set_pos({x=-blu, y=y+1, z=-blu})
|
||||
--self._is_held = false
|
||||
velocityy.y = velocityy.y + 1
|
||||
weapons.clear_inv(self._carried_by)
|
||||
weapons.add_class_items(self._carried_by, weapons.player_list[self._carried_by:get_player_name()].class)
|
||||
self._carried_by = nil
|
||||
self._timer = 5
|
||||
end
|
||||
|
||||
function entity_flag_blue:drop_flag()
|
||||
self.object:set_detach()
|
||||
weapons.clear_inv(self._carried_by)
|
||||
weapons.add_class_items(self._carried_by, weapons.player_list[self._carried_by:get_player_name()].class)
|
||||
self._carried_by = nil
|
||||
--self._is_held = false
|
||||
velocityy.y = velocityy.y + 2
|
||||
self._timer = 2
|
||||
end
|
||||
|
||||
function entity_flag_blue:on_step(dtime)
|
||||
-- apply physics
|
||||
local velocityy = self.object:get_velocity()
|
||||
local accel = self.object:get_acceleration()
|
||||
|
||||
if velocityy.y == 0 then
|
||||
-- Handle friction
|
||||
self._x = self._x * 0.75
|
||||
self._z = self._z * 0.75
|
||||
else
|
||||
self._x = self._x * 0.99
|
||||
self._z = self._z * 0.99
|
||||
end
|
||||
|
||||
-- Round down numbers when percentages exponentialise movement:
|
||||
if math.abs(self._x) < 0.01 then self._x = 0 end
|
||||
if math.abs(self._z) < 0.01 then self._z = 0 end
|
||||
|
||||
if not self._is_held then
|
||||
if self._timer < 0.01 then -- fuck the flag being instantly recaptured
|
||||
-- waiting for player to move flag
|
||||
for _, player in ipairs(minetest.get_connected_players()) do
|
||||
local dist = solarsail.util.functions.pos_to_dist(
|
||||
self.object:get_pos(), player:get_pos())
|
||||
if weapons.player_list[player:get_player_name()].team == nil then return end
|
||||
if weapons.player_list[player:get_player_name()].hp == nil then -- Ignore invalid players
|
||||
elseif weapons.player_list[player:get_player_name()].hp < 1 then -- Ignore dead players
|
||||
elseif dist < 0.76 then
|
||||
self:attach_to_player(player)
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
if self._carried_by ~= nil then
|
||||
local red = 207-39
|
||||
local red2 = 207-42
|
||||
local y = minetest.get_spawn_level(red2, red2)
|
||||
local dist_to_cap =
|
||||
solarsail.util.functions.pos_to_dist(self.object:get_pos(),
|
||||
{x=red, y=y-1, z=red})
|
||||
if dist_to_cap < 1 then
|
||||
self:flag_captured(velocityy)
|
||||
minetest.chat_send_all("Blue Flag Captured")
|
||||
return
|
||||
end
|
||||
local pname = self._carried_by:get_player_name()
|
||||
if solarsail.controls.player[pname].RMB == nil then
|
||||
elseif solarsail.controls.player[pname].RMB then
|
||||
if solarsail.controls.player[pname].sneak == nil then
|
||||
elseif solarsail.controls.player[pname].sneak then
|
||||
self:yeet_flag(velocityy)
|
||||
end
|
||||
elseif weapons.player_list[pname].hp < 1 then
|
||||
self:drop_flag()
|
||||
end
|
||||
end
|
||||
|
||||
if self._timer > 0 then
|
||||
self._timer = self._timer - 0.01
|
||||
if self._timer < 0.01 then
|
||||
if self._is_held then
|
||||
self._is_held = false
|
||||
self._carried_by = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
self.object:set_velocity({x=self._x, y=velocityy.y, z=self._z})
|
||||
self.object:set_acceleration({x=0, y=-9.80, z=0})
|
||||
|
||||
if velocityy.x == 0 then
|
||||
if velocityy.z == 0 then
|
||||
if velocityy.y == 0 then
|
||||
if not self._is_held then
|
||||
if not self._set_waypoint then
|
||||
remove_global_waypoint("blue_flag")
|
||||
local flag_pos = self.object:get_pos()
|
||||
flag_pos.y = flag_pos.y + 2.5
|
||||
add_global_waypoint(flag_pos, "blue_flag",
|
||||
"Blue Flag", weapons.teams.blue_colour)
|
||||
self._set_waypoint = true
|
||||
end
|
||||
end
|
||||
else
|
||||
if not self._is_held then
|
||||
remove_global_waypoint("blue_flag")
|
||||
self._set_waypoint = false
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_entity("weapons:flag_blue", entity_flag_blue)
|
|
@ -0,0 +1,198 @@
|
|||
local entity_flag_red = {
|
||||
visual = "mesh",
|
||||
textures = {
|
||||
"flag_red.png"
|
||||
},
|
||||
mesh = "flag.obj",
|
||||
physical = true,
|
||||
collide_with_objects = false,
|
||||
pointable = false,
|
||||
collisionbox = {-0.3, 0, -0.3, 0.3, 2, 0.3},
|
||||
|
||||
_set_waypoint = false,
|
||||
_timer = -1,
|
||||
_carried_by = nil,
|
||||
_is_held = false,
|
||||
_updated_waypoint = false,
|
||||
_team = "red",
|
||||
_booted = true,
|
||||
_x = 0,
|
||||
_y = 0,
|
||||
_z = 0
|
||||
}
|
||||
|
||||
function entity_flag_red:alert_team(self)
|
||||
for _, player in ipairs(minetest.get_connected_players()) do
|
||||
local pname = player:get_player_name()
|
||||
if self._team == weapons.player_list[pname].team then
|
||||
minetest.chat_send_player(pname,
|
||||
self._carried_by:get_player_name() .. " has picked up your flag.")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function entity_flag_red:attach_to_player(self, player)
|
||||
if player:get_wielded_item().name == "weapons:flag_blue" then return end
|
||||
weapons.remove_global_waypoint("red_flag")
|
||||
self.object:set_attach(player, "Armature_Upper_Body", {x=0,y=0,z=0},{x=0,y=0,z=0})
|
||||
self._carried_by = player
|
||||
self._is_held = true
|
||||
local pname = player:get_player_name()
|
||||
if weapons.player_list[pname].team ~= self._team then
|
||||
self:alert_team(self)
|
||||
end
|
||||
self._set_waypoint = false
|
||||
self._x = 0
|
||||
self._z = 0
|
||||
weapons.clear_inv(player)
|
||||
weapons.add_class_items(player, "red_flag")
|
||||
weapons.player.cancel_reload(player)
|
||||
end
|
||||
|
||||
function entity_flag_red:yeet_flag(self, velocityy)
|
||||
self.object:set_detach()
|
||||
local yaw_rad = self._carried_by:get_look_horizontal()
|
||||
local pitch_rad = self._carried_by:get_look_vertical()
|
||||
self._x, self._z =
|
||||
solarsail.util.functions.yaw_to_vec(yaw_rad, 8, false)
|
||||
self._y = (solarsail.util.functions.y_direction(pitch_rad, 10) * -1)
|
||||
local pitch_mult = solarsail.util.functions.xz_amount(pitch_rad)
|
||||
self._x = self._x * (pitch_mult * 1.55)
|
||||
self._z = self._z * (pitch_mult * 1.55)
|
||||
velocityy.y = velocityy.y + self._y
|
||||
self._timer = 1
|
||||
weapons.clear_inv(self._carried_by)
|
||||
weapons.add_class_items(self._carried_by, weapons.player_list[self._carried_by:get_player_name()].class)
|
||||
self._carried_by = nil
|
||||
end
|
||||
|
||||
function entity_flag_red:flag_captured(self, velocityy)
|
||||
local pname = self._carried_by:get_player_name()
|
||||
self._timer = 5
|
||||
local blu = 207-35
|
||||
local y = weapons.red_base_y
|
||||
self.object:set_detach()
|
||||
self.object:set_pos({x=blu, y=y+8.5, z=blu})
|
||||
velocityy.y = velocityy.y + 1
|
||||
weapons.clear_inv(self._carried_by)
|
||||
weapons.add_class_items(self._carried_by, weapons.player_list[pname].class)
|
||||
self._carried_by = nil
|
||||
minetest.chat_send_all(pname .. " has captured the Red Flag")
|
||||
weapons.score.blue = weapons.score.blue + 1
|
||||
minetest.chat_send_all("Blue Team: " .. weapons.score.blue)
|
||||
minetest.chat_send_all("Red Team: " .. weapons.score.red)
|
||||
end
|
||||
|
||||
function entity_flag_red:drop_flag(self, velocityy)
|
||||
self.object:set_detach()
|
||||
weapons.clear_inv(self._carried_by)
|
||||
weapons.add_class_items(self._carried_by, weapons.player_list[self._carried_by:get_player_name()].class)
|
||||
self._carried_by = nil
|
||||
velocityy.y = velocityy.y + 2
|
||||
self._timer = 2
|
||||
end
|
||||
|
||||
function entity_flag_red:on_step(dtime)
|
||||
-- apply physics
|
||||
local velocityy = self.object:get_velocity()
|
||||
local accel = self.object:get_acceleration()
|
||||
if velocityy.y == 0 then
|
||||
-- Handle friction
|
||||
self._x = self._x * 0.75
|
||||
self._z = self._z * 0.75
|
||||
else
|
||||
self._x = self._x * 0.99
|
||||
self._z = self._z * 0.99
|
||||
end
|
||||
|
||||
-- Round down numbers when percentages exponentialise movement:
|
||||
if math.abs(self._x) < 0.01 then self._x = 0 end
|
||||
if math.abs(self._z) < 0.01 then self._z = 0 end
|
||||
|
||||
if not self._is_held then
|
||||
if self._timer < 0.01 then -- fuck the flag being instantly recaptured
|
||||
-- waiting for player to move flag
|
||||
for _, player in ipairs(minetest.get_connected_players()) do
|
||||
local dist = solarsail.util.functions.pos_to_dist(
|
||||
self.object:get_pos(), player:get_pos())
|
||||
if weapons.player_list[player:get_player_name()].team == nil then end
|
||||
if weapons.player_list[player:get_player_name()].hp == nil then -- Ignore invalid players
|
||||
elseif weapons.player_list[player:get_player_name()].hp < 1 then -- Ignore dead players
|
||||
elseif dist < 0.76 then
|
||||
self:attach_to_player(self, player)
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
if self._carried_by ~= nil then
|
||||
local red = 147-4
|
||||
local y = weapons.blu_base_y
|
||||
local pname = self._carried_by:get_player_name()
|
||||
local dist_to_cap =
|
||||
solarsail.util.functions.pos_to_dist(self.object:get_pos(),
|
||||
{x=-red, y=y-1, z=-red})
|
||||
if dist_to_cap < 1 then
|
||||
if not weapons.lock.red then
|
||||
weapons.lock_red()
|
||||
self:flag_captured(self, velocityy)
|
||||
end
|
||||
end
|
||||
if solarsail.controls.player[pname].RMB == nil then
|
||||
elseif solarsail.controls.player[pname].RMB then
|
||||
if solarsail.controls.player[pname].sneak == nil then
|
||||
elseif solarsail.controls.player[pname].sneak then
|
||||
self:yeet_flag(self, velocityy)
|
||||
end
|
||||
elseif weapons.player_list[pname].hp < 1 then
|
||||
self:drop_flag(self, velocityy)
|
||||
end
|
||||
end
|
||||
|
||||
if self._timer > 0 then
|
||||
self._timer = self._timer - dtime
|
||||
if self._timer < 0.01 then
|
||||
if self._is_held then
|
||||
self._is_held = false
|
||||
self._carried_by = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
self.object:set_velocity({x=self._x, y=velocityy.y, z=self._z})
|
||||
self.object:set_acceleration({x=0, y=-9.80, z=0})
|
||||
|
||||
if velocityy.x == 0 then
|
||||
if velocityy.z == 0 then
|
||||
if velocityy.y == 0 then
|
||||
if not self._is_held then
|
||||
if not self._set_waypoint then
|
||||
weapons.remove_global_waypoint("red_flag")
|
||||
local flag_pos = self.object:get_pos()
|
||||
flag_pos.y = flag_pos.y + 2.5
|
||||
weapons.add_global_waypoint(flag_pos, "red_flag",
|
||||
"Red Flag", weapons.teams.red_colour)
|
||||
self._set_waypoint = true
|
||||
end
|
||||
end
|
||||
-- Update flag position for new players:
|
||||
if weapons.update_red_flag then
|
||||
weapons.remove_global_waypoint("red_flag")
|
||||
local flag_pos = self.object:get_pos()
|
||||
flag_pos.y = flag_pos.y + 2.5
|
||||
weapons.add_global_waypoint(flag_pos, "red_flag",
|
||||
"Red Flag", weapons.teams.red_colour)
|
||||
weapons.update_red_flag = false
|
||||
end
|
||||
else
|
||||
if not self._is_held then
|
||||
weapons.remove_global_waypoint("red_flag")
|
||||
self._set_waypoint = false
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_entity("weapons:flag_red", entity_flag_red)
|
|
@ -0,0 +1,183 @@
|
|||
-- Logic for Super CTF:
|
||||
-- Author: Jordach
|
||||
-- License: Reserved
|
||||
|
||||
weapons.game_mode = "ctf"
|
||||
weapons.list_of_games = {"ctf", "reverse_ctf", "one_flag", "koth", "assault"}
|
||||
weapons.teams = {}
|
||||
weapons.teams.red = 0
|
||||
weapons.teams.blue = 0
|
||||
weapons.teams.red_colour = 0xFF6464
|
||||
weapons.teams.blue_colour = 0x7575FF
|
||||
weapons.score = {}
|
||||
weapons.score.red = 0
|
||||
weapons.score.blue = 0
|
||||
|
||||
weapons.team_names = {}
|
||||
weapons.team_names.red = "Red Team"
|
||||
weapons.team_names.red_icon = "red_team.png"
|
||||
weapons.team_names.blue = "Blue Team"
|
||||
weapons.team_names.blue_icon = "blue_team.png"
|
||||
|
||||
weapons.flag_pos = {}
|
||||
weapons.flag_ref = {}
|
||||
|
||||
function weapons.assign_team(player, team)
|
||||
local pname = player:get_player_name()
|
||||
weapons.player_list[pname].waypoints = {}
|
||||
-- Auto assign player
|
||||
if team == nil then
|
||||
if weapons.teams.red == weapons.teams.blue then
|
||||
local rando = math.random(0, 1)
|
||||
if rando == 1 then
|
||||
weapons.teams.red = weapons.teams.red + 1
|
||||
weapons.player_list[pname].team = "red"
|
||||
minetest.chat_send_player(pname,
|
||||
"You have been automatically assigned to " .. weapons.team_names.red)
|
||||
minetest.log("info",
|
||||
pname.. "has been automatically assigned to " .. weapons.team_names.red)
|
||||
else
|
||||
weapons.teams.blue = weapons.teams.blue + 1
|
||||
weapons.player_list[pname].team = "blue"
|
||||
minetest.chat_send_player(pname,
|
||||
"You have been automatically assigned to " .. weapons.team_names.blue)
|
||||
minetest.log("info",
|
||||
pname.. "has been automatically assigned to " .. weapons.team_names.blue)
|
||||
end
|
||||
elseif weapons.teams.red < weapons.teams.blue then
|
||||
weapons.teams.red = weapons.teams.red + 1
|
||||
weapons.player_list[pname].team = "red"
|
||||
minetest.chat_send_player(pname,
|
||||
"You have been automatically assigned to " .. weapons.team_names.red)
|
||||
minetest.log("info",
|
||||
pname.. "has been automatically assigned to " .. weapons.team_names.red)
|
||||
elseif weapons.teams.red > weapons.teams.blue then
|
||||
weapons.teams.blue = weapons.teams.blue + 1
|
||||
weapons.player_list[pname].team = "blue"
|
||||
minetest.chat_send_player(pname,
|
||||
"You have been automatically assigned to " .. weapons.team_names.blue)
|
||||
minetest.log("info",
|
||||
pname.. "has been automatically assigned to " .. weapons.team_names.blue)
|
||||
end
|
||||
elseif team == "blue" then
|
||||
weapons.teams.blue = weapons.teams.blue + 1
|
||||
weapons.player_list[pname].team = "blue"
|
||||
minetest.chat_send_player(pname,
|
||||
"You have been manually assigned to " .. weapons.team_names.blue)
|
||||
minetest.log("info",
|
||||
pname.. "has switched to " .. weapons.team_names.blue)
|
||||
elseif team == "red" then
|
||||
weapons.teams.red = weapons.teams.red + 1
|
||||
weapons.player_list[pname].team = "red"
|
||||
minetest.chat_send_player(pname,
|
||||
"You have been manually assigned to " .. weapons.team_names.red)
|
||||
minetest.log("info",
|
||||
pname.. "has switched to " .. weapons.team_names.red)
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_on_leaveplayer(function(player, timed_out)
|
||||
local pname = player:get_player_name()
|
||||
if weapons.player_list[pname].team == "red" then
|
||||
weapons.teams.red = weapons.teams.red - 1
|
||||
elseif weapons.player_list[pname].team == "blue" then
|
||||
weapons.teams.blue = weapons.teams.blue - 1
|
||||
end
|
||||
weapons.player_list[pname] = {}
|
||||
end)
|
||||
|
||||
local function add_global_waypoint(pos, id, name, color)
|
||||
for _, player in ipairs(minetest.get_connected_players()) do
|
||||
local pname = player:get_player_name()
|
||||
weapons.player_list[pname].waypoints[id] = player:hud_add({
|
||||
hud_elem_type = "waypoint",
|
||||
name = name,
|
||||
text = "m",
|
||||
number = color,
|
||||
world_pos = pos
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
weapons.add_global_waypoint = add_global_waypoint
|
||||
|
||||
|
||||
local function remove_global_waypoint(id)
|
||||
for _, player in ipairs(minetest.get_connected_players()) do
|
||||
local pname = player:get_player_name()
|
||||
if weapons.player_list[pname].waypoints[id] == nil then
|
||||
else
|
||||
player:hud_remove(weapons.player_list[pname].waypoints[id])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
weapons.remove_global_waypoint = remove_global_waypoint
|
||||
|
||||
local function add_team_waypoint(pos, id, name, color, team)
|
||||
for _, player in ipairs(minetest.get_connected_players()) do
|
||||
local pname = player:get_player_name()
|
||||
if team == weapons.player_list[pname].team then
|
||||
weapons.player_list[pname].waypoints[id] = player:hud_add({
|
||||
hud_elem_type = "waypoint",
|
||||
name = name,
|
||||
text = "m",
|
||||
number = color,
|
||||
world_pos = pos
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function remove_team_waypoint(id, team)
|
||||
for _, player in ipairs(minetest.get_connected_players()) do
|
||||
if weapons.player_list[pname].waypoints[id] == nil then
|
||||
elseif team == weapons.player_list[pname].team then
|
||||
local pname = player:get_player_name()
|
||||
player:hud_remove(weapons.player_list[pname].waypoints[id])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
weapons.lock = {}
|
||||
weapons.lock.red = false
|
||||
weapons.lock.blue = false
|
||||
|
||||
function weapons.unlock_red()
|
||||
weapons.lock.red = false
|
||||
end
|
||||
|
||||
function weapons.lock_red()
|
||||
weapons.lock.red = true
|
||||
minetest.after(5, weapons.unlock_red)
|
||||
end
|
||||
|
||||
function weapons.unlock_blue()
|
||||
weapons.lock.blue = false
|
||||
end
|
||||
|
||||
function weapons.lock_blue()
|
||||
weapons.lock.blue = true
|
||||
minetest.after(5, weapons.unlock_blue)
|
||||
end
|
||||
|
||||
weapons.update_blue_flag = false
|
||||
weapons.update_red_flag = false
|
||||
|
||||
dofile(minetest.get_modpath("weapons").."/flag_blue.lua")
|
||||
dofile(minetest.get_modpath("weapons").."/flag_red.lua")
|
||||
|
||||
-- perform flag cleanup on restart
|
||||
minetest.clear_objects({mode = "full"})
|
||||
|
||||
minetest.after(1, minetest.clear_objects, {mode = "full"})
|
||||
|
||||
local function ctf_spawn_flags()
|
||||
local blu2 = 147-4
|
||||
local redb = 207-35
|
||||
|
||||
minetest.add_entity({x=redb, y=weapons.red_base_y+8.5, z=redb}, "weapons:flag_red")
|
||||
minetest.add_entity({x=-blu2, y=weapons.blu_base_y+8.5, z=-blu2}, "weapons:flag_blue")
|
||||
end
|
||||
|
||||
minetest.after(10, ctf_spawn_flags)
|
|
@ -0,0 +1,528 @@
|
|||
local c_mg_oak_sap = minetest.get_content_id("core:mg_oak_sapling")
|
||||
local c_mg_pine_sap = minetest.get_content_id("core:mg_pine_sapling")
|
||||
local c_mg_pine_snowy_sap = minetest.get_content_id("core:mg_pine_snowy_sapling")
|
||||
|
||||
mcore = {}
|
||||
|
||||
local path = minetest.get_modpath("weapons")
|
||||
local base = "/base.mts"
|
||||
|
||||
local function generate_base_at(pos, area, area_max)
|
||||
for x=area.x, area_max.x do
|
||||
for z=area.z, area_max.z do
|
||||
for y=area.y, area_max.y do
|
||||
minetest.forceload_block({x=x, y=y, z=z}, false)
|
||||
end
|
||||
end
|
||||
end
|
||||
minetest.place_schematic(pos, path..base, "0", nil, true)
|
||||
end
|
||||
|
||||
local function test()
|
||||
|
||||
local red = 207-42
|
||||
local blu = 192-42
|
||||
|
||||
weapons.red_base_y = minetest.get_spawn_level(red, red)
|
||||
|
||||
weapons.blu_base_y = minetest.get_spawn_level(-blu, -blu)
|
||||
|
||||
if weapons.red_base_y == nil then
|
||||
weapons.red_base_y=0
|
||||
end
|
||||
if weapons.blu_base_y == nil then
|
||||
weapons.blu_base_y=0
|
||||
end
|
||||
|
||||
--42 blocks from map edge
|
||||
generate_base_at(
|
||||
{x=red, y=weapons.red_base_y-2, z=red},
|
||||
{x=165, y=weapons.red_base_y-2, z=165},
|
||||
{x=171, y=weapons.red_base_y+12, z=171}
|
||||
)
|
||||
-- 42 blocks from map edge
|
||||
generate_base_at(
|
||||
{x=-blu, y=weapons.blu_base_y-2, z=-blu},
|
||||
{x=-150, y=weapons.blu_base_y-2, z=-150},
|
||||
{x=-144, y=weapons.blu_base_y+12, z=-144}
|
||||
)
|
||||
|
||||
end
|
||||
|
||||
minetest.after(0.1, test)
|
||||
|
||||
-- Fix broken things due to caves
|
||||
minetest.after(15, test)
|
||||
|
||||
function plant_options(meshtype, horizontal, height, size)
|
||||
local pshape, bit1, bit2, bit3 = 0, 0, 0, 0
|
||||
|
||||
if meshtype == "cross" then
|
||||
pshape = 0
|
||||
elseif meshtype == "plus" then
|
||||
pshape = 1
|
||||
elseif meshtype == "asterisk" then
|
||||
pshape = 2
|
||||
elseif meshtype == "croplike" then
|
||||
pshape = 3
|
||||
elseif meshtype == "excroplike" then
|
||||
pshape = 4
|
||||
end
|
||||
|
||||
if horizontal then
|
||||
bit1 = 8
|
||||
end
|
||||
|
||||
if size then
|
||||
bit2 = 16
|
||||
end
|
||||
|
||||
if height then
|
||||
bit3 = 32
|
||||
end
|
||||
|
||||
return pshape+bit1+bit2+bit3
|
||||
end
|
||||
|
||||
minetest.register_on_generated(function(minp, maxp, seed)
|
||||
local timer = os.clock()
|
||||
local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
|
||||
local data = vm:get_data()
|
||||
local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
|
||||
for z=minp.z, maxp.z, 1 do
|
||||
for y=minp.y, maxp.y, 1 do
|
||||
for x=minp.x, maxp.x, 1 do
|
||||
local p_pos = area:index(x,y,z)
|
||||
local content_id = data[p_pos]
|
||||
if content_id == c_mg_oak_sap then
|
||||
mcore.grow_tree({x=x, y=y, z=z}, false, "core:azan_log_4", "core:azan_leaves_4", nil, nil)
|
||||
elseif content_id == c_mg_pine_sap then
|
||||
mcore.grow_pine({x=x, y=y, z=z}, false)
|
||||
elseif content_id == c_mg_pine_snowy_sap then
|
||||
mcore.grow_pine({x=x, y=y, z=z}, true)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
vm:set_data(data)
|
||||
vm:calc_lighting()
|
||||
vm:update_liquids()
|
||||
vm:update_map()
|
||||
end)
|
||||
|
||||
-- Pine Trees
|
||||
|
||||
local random = math.random
|
||||
|
||||
local function add_pine_needles(data, vi, c_air, c_ignore)
|
||||
if data[vi] == c_air or data[vi] == c_ignore then
|
||||
data[vi] = minetest.get_content_id("core:reiz_needles_4")
|
||||
end
|
||||
end
|
||||
|
||||
local function add_pine_snow(data, vi, c_air, c_ignore)
|
||||
if data[vi] == c_air or data[vi] == c_ignore then
|
||||
data[vi] = minetest.get_content_id("core:reiz_needles_snowy_4")
|
||||
end
|
||||
end
|
||||
|
||||
local function add_snow(data, vi, c_air, c_ignore)
|
||||
if data[vi] == c_air or data[vi] == c_ignore then
|
||||
data[vi] = minetest.get_content_id("core:snow_4")
|
||||
end
|
||||
end
|
||||
|
||||
function mcore.grow_pine(pos, boolsnow)
|
||||
local x, y, z = pos.x, pos.y, pos.z
|
||||
local maxy = y + math.random(7, 13) --trunk top
|
||||
|
||||
local c_air = minetest.get_content_id("air")
|
||||
local c_ignore = minetest.get_content_id("ignore")
|
||||
local c_pinetree = minetest.get_content_id("core:reiz_log_4")
|
||||
local c_pine_needles = minetest.get_content_id("core:reiz_needles_4")
|
||||
local c_snow = minetest.get_content_id("core:snow_4")
|
||||
local c_snowblock = minetest.get_content_id("core:snowblock_4")
|
||||
local c_dirtsnow = minetest.get_content_id("core:grass_snow_4")
|
||||
|
||||
local vm = minetest.get_voxel_manip()
|
||||
local minp, maxp = vm:read_from_map(
|
||||
{x = x - 3, y = y - 1, z = z - 3},
|
||||
{x = x + 3, y = maxy + 3, z = z + 3}
|
||||
)
|
||||
local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp})
|
||||
local data = vm:get_data()
|
||||
|
||||
--upper branches
|
||||
|
||||
local dev = 3
|
||||
for yy = maxy - 1, maxy + 1 do
|
||||
for zz = z - dev, z + dev do
|
||||
local vi = a:index(x - dev, yy, zz)
|
||||
for xx = x - dev, x + dev do
|
||||
if math.random() < 0.95 - dev * 0.05 then
|
||||
if boolsnow == false then
|
||||
add_pine_needles(data, vi, c_air, c_ignore)
|
||||
elseif boolsnow == true then
|
||||
add_pine_snow(data, vi, c_air, c_ignore)
|
||||
else
|
||||
add_pine_needles(data, vi, c_air, c_ignore)
|
||||
end
|
||||
end
|
||||
vi = vi + 1
|
||||
end
|
||||
end
|
||||
dev = dev - 1
|
||||
end
|
||||
|
||||
--center top nodes
|
||||
|
||||
if boolsnow == false then
|
||||
add_pine_needles(data, a:index(x, maxy + 1, z), c_air, c_ignore)
|
||||
add_pine_needles(data, a:index(x, maxy + 2, z), c_air, c_ignore)
|
||||
-- Paramat added a pointy top node
|
||||
elseif boolsnow == true then
|
||||
add_pine_snow(data, a:index(x, maxy + 1, z), c_air, c_ignore)
|
||||
add_pine_snow(data, a:index(x, maxy + 1, z), c_air, c_ignore)
|
||||
-- Lower branches layer
|
||||
else
|
||||
add_pine_needles(data, a:index(x, maxy + 1, z), c_air, c_ignore)
|
||||
add_pine_needles(data, a:index(x, maxy + 1, z), c_air, c_ignore)
|
||||
end
|
||||
|
||||
local my = 0
|
||||
for i = 1, 20 do -- Random 2x2 squares of needles
|
||||
local xi = x + math.random(-3, 2)
|
||||
local yy = maxy + math.random(-6, -5)
|
||||
local zi = z + math.random(-3, 2)
|
||||
if yy > my then
|
||||
my = yy
|
||||
end
|
||||
for zz = zi, zi+1 do
|
||||
local vi = a:index(xi, yy, zz)
|
||||
for xx = xi, xi + 1 do
|
||||
if boolsnow == false then
|
||||
add_pine_needles(data, vi, c_air, c_ignore)
|
||||
elseif boolsnow == true then
|
||||
add_pine_snow(data, vi, c_air, c_ignore)
|
||||
add_pine_needles(data, vi, c_air, c_ignore)
|
||||
else
|
||||
add_pine_snow(data, vi, c_air, c_ignore)
|
||||
end
|
||||
vi = vi + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local dev = 2
|
||||
for yy = my + 1, my + 2 do
|
||||
for zz = z - dev, z + dev do
|
||||
local vi = a:index(x - dev, yy, zz)
|
||||
for xx = x - dev, x + dev do
|
||||
if random() < 0.95 - dev * 0.05 then
|
||||
if boolsnow == false then
|
||||
add_pine_needles(data, vi, c_air, c_ignore)
|
||||
elseif boolsnow == true then
|
||||
add_pine_snow(data, vi, c_air, c_ignore)
|
||||
add_pine_needles(data, vi, c_air, c_ignore)
|
||||
else
|
||||
add_pine_snow(data, vi, c_air, c_ignore)
|
||||
end
|
||||
end
|
||||
vi = vi + 1
|
||||
end
|
||||
end
|
||||
dev = dev - 1
|
||||
end
|
||||
|
||||
-- Trunk
|
||||
for yy = y, maxy do
|
||||
local vi = a:index(x, yy, z)
|
||||
data[vi] = c_pinetree
|
||||
end
|
||||
|
||||
vm:set_data(data)
|
||||
vm:calc_lighting()
|
||||
vm:write_to_map()
|
||||
vm:update_map()
|
||||
end
|
||||
|
||||
--standard trees
|
||||
|
||||
local function add_trunk_and_leaves(data, a, pos, tree_cid, leaves_cid,
|
||||
height, size, iters, is_apple_tree, log_grass)
|
||||
local x, y, z = pos.x, pos.y, pos.z
|
||||
local c_air = minetest.get_content_id("air")
|
||||
local c_ignore = minetest.get_content_id("ignore")
|
||||
local c_apple = minetest.get_content_id("air")
|
||||
|
||||
-- Trunk
|
||||
for y_dist = 0, height - 1 do
|
||||
local vi = a:index(x, y + y_dist, z)
|
||||
local node_id = data[vi]
|
||||
|
||||
if y_dist == 0 then
|
||||
|
||||
data[vi] = log_grass
|
||||
|
||||
elseif node_id == c_air or node_id == c_ignore
|
||||
or node_id == leaves_cid then
|
||||
|
||||
data[vi] = tree_cid
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
-- Force leaves near the trunk
|
||||
for z_dist = -1, 1 do
|
||||
for y_dist = -size, 1 do
|
||||
local vi = a:index(x - 1, y + height + y_dist, z + z_dist)
|
||||
for x_dist = -1, 1 do
|
||||
if data[vi] == c_air or data[vi] == c_ignore then
|
||||
if is_apple_tree and random(1, 8) == 1 then
|
||||
data[vi] = c_apple
|
||||
else
|
||||
data[vi] = leaves_cid
|
||||
end
|
||||
end
|
||||
vi = vi + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Randomly add leaves in 2x2x2 clusters.
|
||||
for i = 1, iters do
|
||||
local clust_x = x + random(-size, size - 1)
|
||||
local clust_y = y + height + random(-size, 0)
|
||||
local clust_z = z + random(-size, size - 1)
|
||||
|
||||
for xi = 0, 1 do
|
||||
for yi = 0, 1 do
|
||||
for zi = 0, 1 do
|
||||
local vi = a:index(clust_x + xi, clust_y + yi, clust_z + zi)
|
||||
if data[vi] == c_air or data[vi] == c_ignore then
|
||||
if is_apple_tree and random(1, 8) == 1 then
|
||||
data[vi] = c_apple
|
||||
else
|
||||
data[vi] = leaves_cid
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function mcore.grow_tree(pos, is_apple_tree, trunk_node, leaves_node, fallen_leaves_node, chance)
|
||||
--[[
|
||||
NOTE: Tree-placing code is currently duplicated in the engine
|
||||
and in games that have saplings; both are deprecated but not
|
||||
replaced yet
|
||||
--]]
|
||||
|
||||
if fallen_leaves_node ~= nil or chance ~= nil then
|
||||
place_leaves_on_ground(pos, chance, fallen_leaves_node)
|
||||
end
|
||||
|
||||
local x, y, z = pos.x, pos.y, pos.z
|
||||
local height = random(4, 7)
|
||||
local c_tree = minetest.get_content_id(trunk_node)
|
||||
local c_leaves = minetest.get_content_id(leaves_node)
|
||||
local log_grass = minetest.get_content_id(trunk_node)
|
||||
|
||||
local vm = minetest.get_voxel_manip()
|
||||
local minp, maxp = vm:read_from_map(
|
||||
{x = pos.x - 2, y = pos.y, z = pos.z - 2},
|
||||
{x = pos.x + 2, y = pos.y + height + 1, z = pos.z + 2}
|
||||
)
|
||||
local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp})
|
||||
local data = vm:get_data()
|
||||
|
||||
add_trunk_and_leaves(data, a, pos, c_tree, c_leaves, height, 2, 8, is_apple_tree, log_grass)
|
||||
|
||||
vm:set_data(data)
|
||||
vm:calc_lighting()
|
||||
vm:write_to_map()
|
||||
vm:update_map()
|
||||
end
|
||||
|
||||
-- Biomes
|
||||
|
||||
minetest.register_biome({
|
||||
name = "plains",
|
||||
node_top = "core:grass_4",
|
||||
depth_top = 1,
|
||||
node_filler = "core:dirt_4",
|
||||
depth_filler = 3,
|
||||
y_min = 1,
|
||||
y_max = 120,
|
||||
node_water = "core:water_source",
|
||||
node_river_water = "core:water_source",
|
||||
heat_point = 45,
|
||||
humidity_point = 50,
|
||||
})
|
||||
|
||||
minetest.register_biome({
|
||||
name = "highlands",
|
||||
node_top = "core:grass_4",
|
||||
depth_top = 1,
|
||||
node_filler = "core:dirt_4",
|
||||
depth_filler = 3,
|
||||
y_min = 4,
|
||||
y_max = 220,
|
||||
node_water = "core:water_source",
|
||||
node_river_water = "core:water_source",
|
||||
heat_point = 45,
|
||||
humidity_point = 76,
|
||||
})
|
||||
|
||||
minetest.register_biome({
|
||||
name = "plains_forest",
|
||||
node_top = "core:grass_4",
|
||||
depth_top = 1,
|
||||
node_filler = "core:dirt_4",
|
||||
depth_filler = 3,
|
||||
y_min = 4,
|
||||
y_max = 80,
|
||||
node_water = "core:water_source",
|
||||
node_river_water = "core:water_source",
|
||||
heat_point = 45,
|
||||
humidity_point = 10,
|
||||
})
|
||||
|
||||
minetest.register_biome({
|
||||
name = "beach",
|
||||
node_top = "core:sand_4",
|
||||
depth_top = 1,
|
||||
node_filler = "core:sand_4",
|
||||
depth_filler = 3,
|
||||
y_min = 0,
|
||||
y_max = 4,
|
||||
node_water = "core:water_source",
|
||||
node_river_water = "core:water_source",
|
||||
heat_point = 45,
|
||||
humidity_point = 35,
|
||||
})
|
||||
|
||||
minetest.register_biome({
|
||||
name = "gravel_beach",
|
||||
node_top = "core:sand_4",
|
||||
depth_top = 1,
|
||||
node_filler = "core:sand_4",
|
||||
depth_filler = 3,
|
||||
y_min = 0,
|
||||
y_max = 4,
|
||||
node_water = "core:water_source",
|
||||
node_river_water = "core:water_source",
|
||||
heat_point = 45,
|
||||
humidity_point = 76,
|
||||
})
|
||||
|
||||
minetest.register_biome({
|
||||
name = "beach_cold",
|
||||
node_dust = "core:snow_4",
|
||||
node_top = "core:sand_4",
|
||||
depth_top = 1,
|
||||
node_filler = "core:sand_4",
|
||||
depth_filler = 3,
|
||||
y_min = 0,
|
||||
y_max = 4,
|
||||
node_water = "core:water_source",
|
||||
node_river_water = "core:water_source",
|
||||
node_water_top = "core:ice_4",
|
||||
depth_water_top = 1,
|
||||
heat_point = 20,
|
||||
humidity_point = 35,
|
||||
})
|
||||
|
||||
minetest.register_biome({
|
||||
name = "snowy_plains",
|
||||
node_dust = "core:snow_4",
|
||||
node_top = "core:grass_snow_4",
|
||||
depth_top = 1,
|
||||
node_filler = "core:dirt_4",
|
||||
depth_filler = 3,
|
||||
node_water = "core:water_source",
|
||||
node_river_water = "core:water_source",
|
||||
node_water_top = "core:ice_4",
|
||||
depth_water_top = 1,
|
||||
y_min = 4,
|
||||
y_max = 150,
|
||||
heat_point = 20,
|
||||
humidity_point = 50,
|
||||
})
|
||||
|
||||
minetest.register_biome({
|
||||
name = "snowy_mountain",
|
||||
node_dust = "core:snow_4",
|
||||
node_top = "core:snowblock_4",
|
||||
depth_top = 1,
|
||||
node_water = "core:water_source",
|
||||
node_river_water = "core:water_source",
|
||||
node_water_top = "core:ice_4",
|
||||
depth_water_top = 1,
|
||||
y_min = 150,
|
||||
y_max = 1000,
|
||||
heat_point = 50,
|
||||
humidity_point = 50,
|
||||
})
|
||||
|
||||
minetest.register_biome({
|
||||
name = "snowy_forest",
|
||||
node_dust = "core:snow_4",
|
||||
node_top = "core:grass_snow_4",
|
||||
depth_top = 1,
|
||||
node_filler = "core:dirt_4",
|
||||
depth_filler = 3,
|
||||
y_min = 30,
|
||||
y_max = 150,
|
||||
node_water = "core:water_source",
|
||||
node_river_water = "core:water_source",
|
||||
node_water_top = "core:ice_4",
|
||||
depth_water_top = 1,
|
||||
heat_point = 12,
|
||||
humidity_point = 25,
|
||||
})
|
||||
|
||||
-- Decorations
|
||||
|
||||
minetest.register_decoration({
|
||||
deco_type = "simple",
|
||||
place_on = "core:grass_4",
|
||||
decoration = {"core:mg_pine_sapling"},
|
||||
sidelen = 16,
|
||||
fill_ratio = 0.025,
|
||||
biomes = {"highlands"},
|
||||
height = 1,
|
||||
})
|
||||
|
||||
minetest.register_decoration({
|
||||
deco_type = "simple",
|
||||
place_on = "core:grass_4",
|
||||
decoration = {"core:mg_oak_sapling"},
|
||||
sidelen = 16,
|
||||
fill_ratio = 0.01,
|
||||
biomes = {"plains_forest"},
|
||||
height = 1,
|
||||
})
|
||||
|
||||
minetest.register_decoration({
|
||||
deco_type = "simple",
|
||||
place_on = {"core:grass_4"},
|
||||
decoration = {"core:mg_oak_sapling"},
|
||||
sidelen = 80,
|
||||
fill_ratio = 0.0001,
|
||||
biomes = {"plains"},
|
||||
height = 1,
|
||||
})
|
||||
|
||||
minetest.register_decoration({
|
||||
deco_type = "simple",
|
||||
place_on = "core:grass_4",
|
||||
decoration = {"core:longgrass_1", "core:longgrass_2", "core:longgrass_3"},
|
||||
sidelen = 16,
|
||||
fill_ratio = 0.2,
|
||||
biomes = {"plains", "plains_forest", "highlands"},
|
||||
height = 1,
|
||||
param2 = plant_options("cross", true, true, false),
|
||||
})
|
|
@ -0,0 +1,74 @@
|
|||
# Blender v2.79 (sub 0) OBJ File: 'Flag.blend'
|
||||
# www.blender.org
|
||||
o Cube_Cube.001
|
||||
v -0.625000 0.000000 0.625000
|
||||
v -0.625000 25.000000 0.625000
|
||||
v -0.625000 0.000000 -0.625000
|
||||
v -0.625000 25.000000 -0.625000
|
||||
v 0.625000 0.000000 0.625000
|
||||
v 0.625000 25.000000 0.625000
|
||||
v 0.625000 0.000000 -0.625000
|
||||
v 0.625000 25.000000 -0.625000
|
||||
v 0.625000 16.875000 0.312500
|
||||
v 0.625000 24.375000 0.312500
|
||||
v 0.625000 16.875000 -0.312500
|
||||
v 0.625000 24.375000 -0.312500
|
||||
v 13.125000 16.875000 0.312500
|
||||
v 13.125000 24.375000 0.312500
|
||||
v 13.125000 16.875000 -0.312500
|
||||
v 13.125000 24.375000 -0.312500
|
||||
vt 0.250000 0.000000
|
||||
vt 0.250000 1.000000
|
||||
vt 0.187500 1.000000
|
||||
vt 0.187500 0.000000
|
||||
vt 0.125000 1.000000
|
||||
vt 0.125000 0.000000
|
||||
vt 0.062500 1.000000
|
||||
vt 0.062500 0.000000
|
||||
vt 0.000000 1.000000
|
||||
vt 0.000000 0.000000
|
||||
vt 0.250000 0.937500
|
||||
vt 0.312500 0.937500
|
||||
vt 0.312500 1.000000
|
||||
vt 0.250000 1.000000
|
||||
vt 0.312500 0.937500
|
||||
vt 0.375000 0.937500
|
||||
vt 0.375000 1.000000
|
||||
vt 0.312500 1.000000
|
||||
vt 0.000000 0.000000
|
||||
vt 1.000000 0.000000
|
||||
vt 1.000000 1.000000
|
||||
vt 0.000000 1.000000
|
||||
vt 0.906250 0.031250
|
||||
vt 0.906250 0.406250
|
||||
vt 0.281250 0.406250
|
||||
vt 0.281250 0.031250
|
||||
vt 0.937500 0.468750
|
||||
vt 0.937500 0.843750
|
||||
vt 0.906250 0.843750
|
||||
vt 0.906250 0.468750
|
||||
vt 0.281250 0.843750
|
||||
vt 0.281250 0.468750
|
||||
vt 0.281250 0.437500
|
||||
vt 0.906250 0.437500
|
||||
vt 0.906250 0.875000
|
||||
vt 0.281250 0.875000
|
||||
vn -1.0000 0.0000 0.0000
|
||||
vn 0.0000 0.0000 -1.0000
|
||||
vn 1.0000 0.0000 0.0000
|
||||
vn 0.0000 0.0000 1.0000
|
||||
vn 0.0000 -1.0000 0.0000
|
||||
vn 0.0000 1.0000 0.0000
|
||||
s off
|
||||
f 1/1/1 2/2/1 4/3/1 3/4/1
|
||||
f 3/4/2 4/3/2 8/5/2 7/6/2
|
||||
f 7/6/3 8/5/3 6/7/3 5/8/3
|
||||
f 5/8/4 6/7/4 2/9/4 1/10/4
|
||||
f 3/11/5 7/12/5 5/13/5 1/14/5
|
||||
f 8/15/6 4/16/6 2/17/6 6/18/6
|
||||
f 9/19/1 10/20/1 12/21/1 11/22/1
|
||||
f 11/23/2 12/24/2 16/25/2 15/26/2
|
||||
f 15/27/3 16/28/3 14/29/3 13/30/3
|
||||
f 13/30/4 14/29/4 10/31/4 9/32/4
|
||||
f 11/33/5 15/34/5 13/30/5 9/32/5
|
||||
f 16/35/6 12/36/6 10/31/6 14/29/6
|
|
@ -0,0 +1,10 @@
|
|||
# Blender MTL File: 'RocketEnt.blend'
|
||||
# Material Count: 1
|
||||
|
||||
newmtl None
|
||||
Ns 0
|
||||
Ka 0.000000 0.000000 0.000000
|
||||
Kd 0.8 0.8 0.8
|
||||
Ks 0.8 0.8 0.8
|
||||
d 1
|
||||
illum 2
|
|
@ -0,0 +1,180 @@
|
|||
# Blender v2.79 (sub 0) OBJ File: 'RocketEnt.blend'
|
||||
# www.blender.org
|
||||
mtllib rocket_ent.mtl
|
||||
o Cube_Cube.001
|
||||
v 0.250000 -0.250000 0.250000
|
||||
v 0.250000 0.250000 0.250000
|
||||
v 0.250000 -0.250000 1.890625
|
||||
v 0.250000 0.250000 1.890625
|
||||
v -0.250000 -0.250000 0.250000
|
||||
v -0.250000 0.250000 0.250000
|
||||
v -0.250000 -0.250000 1.890625
|
||||
v -0.250000 0.250000 1.890625
|
||||
v 0.250000 -0.250000 1.890625
|
||||
v 0.250000 0.250000 1.890625
|
||||
v -0.250000 -0.250000 1.890625
|
||||
v -0.250000 0.250000 1.890625
|
||||
v 0.170860 0.170859 2.250000
|
||||
v 0.170860 -0.170859 2.250000
|
||||
v -0.170859 -0.170859 2.250000
|
||||
v -0.170859 0.170859 2.250000
|
||||
v 0.499488 -0.234375 -0.331009
|
||||
v 0.499488 0.234375 -0.331009
|
||||
v 0.242973 -0.234375 0.373761
|
||||
v 0.242973 0.234375 0.373761
|
||||
v 0.382026 -0.234375 -0.373761
|
||||
v 0.382026 0.234375 -0.373761
|
||||
v 0.125511 -0.234375 0.331008
|
||||
v 0.125511 0.234375 0.331008
|
||||
v -0.382027 -0.234375 -0.373761
|
||||
v -0.382027 0.234375 -0.373761
|
||||
v -0.125512 -0.234375 0.331009
|
||||
v -0.125512 0.234375 0.331009
|
||||
v -0.499489 -0.234375 -0.331008
|
||||
v -0.499489 0.234375 -0.331008
|
||||
v -0.242973 -0.234375 0.373761
|
||||
v -0.242973 0.234375 0.373761
|
||||
v 0.234375 0.382027 -0.373761
|
||||
v 0.234375 0.499488 -0.331009
|
||||
v 0.234375 0.125512 0.331008
|
||||
v 0.234375 0.242973 0.373761
|
||||
v -0.234375 0.382027 -0.373761
|
||||
v -0.234375 0.499488 -0.331008
|
||||
v -0.234375 0.125512 0.331008
|
||||
v -0.234375 0.242973 0.373761
|
||||
v 0.234375 -0.499488 -0.331009
|
||||
v 0.234375 -0.382027 -0.373761
|
||||
v 0.234375 -0.242973 0.373761
|
||||
v 0.234375 -0.125512 0.331008
|
||||
v -0.234375 -0.499488 -0.331008
|
||||
v -0.234375 -0.382027 -0.373761
|
||||
v -0.234375 -0.242973 0.373761
|
||||
v -0.234375 -0.125512 0.331008
|
||||
v 0.062500 0.250000 1.125000
|
||||
v 0.062500 0.375000 1.125000
|
||||
v 0.031250 0.250000 1.875000
|
||||
v 0.031250 0.312500 1.875000
|
||||
v -0.062500 0.250000 1.125000
|
||||
v -0.062500 0.375000 1.125000
|
||||
v -0.031250 0.250000 1.875000
|
||||
v -0.031250 0.312500 1.875000
|
||||
v 0.062500 -0.375000 1.125000
|
||||
v 0.062500 -0.250000 1.125000
|
||||
v 0.031250 -0.312500 1.875000
|
||||
v 0.031250 -0.250000 1.875000
|
||||
v -0.062500 -0.375000 1.125000
|
||||
v -0.062500 -0.250000 1.125000
|
||||
v -0.031250 -0.312500 1.875000
|
||||
v -0.031250 -0.250000 1.875000
|
||||
v -0.250000 0.062500 1.125000
|
||||
v -0.375000 0.062500 1.125000
|
||||
v -0.250000 0.031250 1.875000
|
||||
v -0.312500 0.031250 1.875000
|
||||
v -0.250000 -0.062500 1.125000
|
||||
v -0.375000 -0.062500 1.125000
|
||||
v -0.250000 -0.031250 1.875000
|
||||
v -0.312500 -0.031250 1.875000
|
||||
v 0.375000 0.062500 1.125000
|
||||
v 0.250000 0.062500 1.125000
|
||||
v 0.312500 0.031250 1.875000
|
||||
v 0.250000 0.031250 1.875000
|
||||
v 0.375000 -0.062500 1.125000
|
||||
v 0.250000 -0.062500 1.125000
|
||||
v 0.312500 -0.031250 1.875000
|
||||
v 0.250000 -0.031250 1.875000
|
||||
vn 1.0000 0.0000 -0.0000
|
||||
vn 0.0000 0.0000 1.0000
|
||||
vn -1.0000 0.0000 0.0000
|
||||
vn -0.0000 0.0000 -1.0000
|
||||
vn 0.0000 -1.0000 0.0000
|
||||
vn 0.0000 1.0000 0.0000
|
||||
vn -0.9766 0.0000 0.2151
|
||||
vn 0.0000 -0.9766 0.2151
|
||||
vn 0.0000 0.9766 0.2151
|
||||
vn 0.9766 0.0000 0.2151
|
||||
vn 0.9397 0.0000 0.3420
|
||||
vn -0.3420 0.0000 0.9397
|
||||
vn -0.9397 0.0000 -0.3420
|
||||
vn 0.3420 0.0000 -0.9397
|
||||
vn 0.9397 0.0000 -0.3420
|
||||
vn 0.3420 0.0000 0.9397
|
||||
vn -0.9397 0.0000 0.3420
|
||||
vn -0.3420 0.0000 -0.9397
|
||||
vn 0.0000 -0.3420 0.9397
|
||||
vn -0.0000 0.3420 -0.9397
|
||||
vn -0.0000 -0.9397 -0.3420
|
||||
vn 0.0000 0.9397 0.3420
|
||||
vn 0.0000 0.3420 0.9397
|
||||
vn -0.0000 -0.3420 -0.9397
|
||||
vn 0.0000 -0.9397 0.3420
|
||||
vn -0.0000 0.9397 -0.3420
|
||||
vn 0.9991 0.0000 0.0416
|
||||
vn -0.9991 0.0000 0.0416
|
||||
vn 0.0000 0.9965 0.0830
|
||||
vn 0.0000 -0.9965 0.0830
|
||||
vn 0.0000 0.9991 0.0416
|
||||
vn 0.0000 -0.9991 0.0416
|
||||
vn -0.9965 0.0000 0.0830
|
||||
vn 0.9965 0.0000 0.0830
|
||||
usemtl None
|
||||
s off
|
||||
f 1//1 2//1 4//1 3//1
|
||||
f 3//2 4//2 8//2 7//2
|
||||
f 7//3 8//3 6//3 5//3
|
||||
f 5//4 6//4 2//4 1//4
|
||||
f 3//5 7//5 5//5 1//5
|
||||
f 8//6 4//6 2//6 6//6
|
||||
f 9//4 11//4 12//4 10//4
|
||||
f 14//2 13//2 16//2 15//2
|
||||
f 12//7 11//7 15//7 16//7
|
||||
f 11//8 9//8 14//8 15//8
|
||||
f 10//9 12//9 16//9 13//9
|
||||
f 9//10 10//10 13//10 14//10
|
||||
f 17//11 18//11 20//11 19//11
|
||||
f 19//12 20//12 24//12 23//12
|
||||
f 23//13 24//13 22//13 21//13
|
||||
f 21//14 22//14 18//14 17//14
|
||||
f 19//5 23//5 21//5 17//5
|
||||
f 24//6 20//6 18//6 22//6
|
||||
f 25//15 26//15 28//15 27//15
|
||||
f 27//16 28//16 32//16 31//16
|
||||
f 31//17 32//17 30//17 29//17
|
||||
f 29//18 30//18 26//18 25//18
|
||||
f 27//5 31//5 29//5 25//5
|
||||
f 32//6 28//6 26//6 30//6
|
||||
f 33//1 34//1 36//1 35//1
|
||||
f 35//19 36//19 40//19 39//19
|
||||
f 39//3 40//3 38//3 37//3
|
||||
f 37//20 38//20 34//20 33//20
|
||||
f 35//21 39//21 37//21 33//21
|
||||
f 40//22 36//22 34//22 38//22
|
||||
f 41//1 42//1 44//1 43//1
|
||||
f 43//23 44//23 48//23 47//23
|
||||
f 47//3 48//3 46//3 45//3
|
||||
f 45//24 46//24 42//24 41//24
|
||||
f 43//25 47//25 45//25 41//25
|
||||
f 48//26 44//26 42//26 46//26
|
||||
f 49//27 50//27 52//27 51//27
|
||||
f 51//2 52//2 56//2 55//2
|
||||
f 55//28 56//28 54//28 53//28
|
||||
f 53//4 54//4 50//4 49//4
|
||||
f 51//5 55//5 53//5 49//5
|
||||
f 56//29 52//29 50//29 54//29
|
||||
f 57//27 58//27 60//27 59//27
|
||||
f 59//2 60//2 64//2 63//2
|
||||
f 63//28 64//28 62//28 61//28
|
||||
f 61//4 62//4 58//4 57//4
|
||||
f 59//30 63//30 61//30 57//30
|
||||
f 64//6 60//6 58//6 62//6
|
||||
f 65//31 66//31 68//31 67//31
|
||||
f 67//2 68//2 72//2 71//2
|
||||
f 71//32 72//32 70//32 69//32
|
||||
f 69//4 70//4 66//4 65//4
|
||||
f 67//1 71//1 69//1 65//1
|
||||
f 72//33 68//33 66//33 70//33
|
||||
f 73//31 74//31 76//31 75//31
|
||||
f 75//2 76//2 80//2 79//2
|
||||
f 79//32 80//32 78//32 77//32
|
||||
f 77//4 78//4 74//4 73//4
|
||||
f 75//34 79//34 77//34 73//34
|
||||
f 80//3 76//3 74//3 78//3
|
|
@ -0,0 +1,627 @@
|
|||
-- Weapons for Super CTF:
|
||||
-- Author: Jordach
|
||||
-- License: Reserved
|
||||
|
||||
local assault = {}
|
||||
assault.stats = {
|
||||
hp = 200,
|
||||
shield = 150,
|
||||
hotbar = 6,
|
||||
}
|
||||
assault.items = {
|
||||
"weapons:assault_rifle",
|
||||
--"weapons:demo_charge",
|
||||
"weapons:pickaxe",
|
||||
"core:team_neutral"
|
||||
}
|
||||
assault.physics = {
|
||||
speed = 1.15,
|
||||
jump = 1,
|
||||
gravity = 1,
|
||||
sneak = true,
|
||||
sneak_glitch = true,
|
||||
new_move = false
|
||||
}
|
||||
|
||||
local marksman = {}
|
||||
marksman.stats = {
|
||||
hp = 125,
|
||||
shield = 50,
|
||||
hotbar = 5,
|
||||
}
|
||||
marksman.items = {
|
||||
"weapons:railgun",
|
||||
--"weapons:pistol",
|
||||
"weapons:pickaxe",
|
||||
"core:team_neutral"
|
||||
}
|
||||
marksman.physics = {
|
||||
speed = 0.95,
|
||||
jump = 1.5,
|
||||
gravity = 1,
|
||||
sneak = true,
|
||||
sneak_glitch = true,
|
||||
new_move = false
|
||||
}
|
||||
|
||||
local medic = {}
|
||||
medic.stats = {
|
||||
hp = 125,
|
||||
sheild = 200
|
||||
}
|
||||
medic.items = {
|
||||
"weapons:smg",
|
||||
"weapons:pickaxe",
|
||||
--"weapons:injector",
|
||||
--"weapons:resurrector",
|
||||
"core:team_neutral"
|
||||
}
|
||||
medic.physics = {
|
||||
speed = 1.4,
|
||||
jump = 1.25,
|
||||
gravity = 1,
|
||||
sneak = true,
|
||||
sneak_glitch = true,
|
||||
new_move = false
|
||||
}
|
||||
local scout = {}
|
||||
scout.stats = {
|
||||
hp = 75,
|
||||
sheild = 75
|
||||
}
|
||||
scout.items = {
|
||||
"weapons:shotgun",
|
||||
--"weapons:shaped_charge",
|
||||
"weapons:pickaxe",
|
||||
"core:team_neutral"
|
||||
}
|
||||
scout.physics = {
|
||||
speed = 1.55,
|
||||
jump = 2,
|
||||
gravity = 1,
|
||||
sneak = true,
|
||||
sneak_glitch = true,
|
||||
new_move = false
|
||||
}
|
||||
|
||||
weapons.assault = assault
|
||||
weapons.marksman = marksman
|
||||
weapons.medic = medic
|
||||
weapons.scout = scout
|
||||
|
||||
weapons.class_formspec =
|
||||
"size[8,8]"..
|
||||
"button[0,7;2,1;assault;Assault]"..
|
||||
--"button[2,7;2,1;marksman;Marksman]"..
|
||||
--"button[4,7;2,1;medic;Medic]"..
|
||||
--"button[6,7;2,1;scout;Scout]"..
|
||||
"button[0,0;4,1;lefty;Left Shoulder View]"..
|
||||
"button[4,0;4,1;righty;Right Shoulder View]"
|
||||
|
||||
local function clear_inv(player)
|
||||
local p_inv = player:get_inventory()
|
||||
p_inv:set_list("main", {})
|
||||
p_inv:set_list("craft", {})
|
||||
end
|
||||
|
||||
weapons.clear_inv = clear_inv
|
||||
|
||||
local function add_class_items(player, class)
|
||||
local p_inv = player:get_inventory()
|
||||
if class == "assault" then
|
||||
for k, stack in pairs(assault.items) do
|
||||
local istack = ItemStack(stack .. " 1")
|
||||
local node = minetest.registered_nodes[stack .. "_" ..
|
||||
weapons.player_list[player:get_player_name()].team]
|
||||
if node == nil then
|
||||
elseif node._type == nil then
|
||||
elseif node._type == "gun" then
|
||||
istack = ItemStack(stack .. "_" ..
|
||||
weapons.player_list[player:get_player_name()].team ..
|
||||
" 1")
|
||||
elseif node._type == "tool" then
|
||||
istack = ItemStack(stack .. "_" ..
|
||||
weapons.player_list[player:get_player_name()].team ..
|
||||
" 1")
|
||||
end
|
||||
p_inv:add_item("main", istack)
|
||||
end
|
||||
player:hud_set_hotbar_itemcount(#assault.items)
|
||||
return
|
||||
elseif class == "marksman" then
|
||||
for k, stack in pairs(marksman.items) do
|
||||
local istack = ItemStack(stack .. " 1")
|
||||
local node = minetest.registered_nodes[stack .. "_" ..
|
||||
weapons.player_list[player:get_player_name()].team]
|
||||
if node == nil then
|
||||
elseif node._type == nil then
|
||||
elseif node._type == "gun" then
|
||||
istack = ItemStack(stack .. "_" ..
|
||||
weapons.player_list[player:get_player_name()].team ..
|
||||
" 1")
|
||||
elseif node._type == "tool" then
|
||||
istack = ItemStack(stack .. "_" ..
|
||||
weapons.player_list[player:get_player_name()].team ..
|
||||
" 1")
|
||||
end
|
||||
p_inv:add_item("main", istack)
|
||||
end
|
||||
player:hud_set_hotbar_itemcount(#marksman.items)
|
||||
return
|
||||
elseif class == "medic" then
|
||||
for k, stack in pairs(medic.items) do
|
||||
local istack = ItemStack(stack .. " 1")
|
||||
local node = minetest.registered_nodes[stack .. "_" ..
|
||||
weapons.player_list[player:get_player_name()].team]
|
||||
if node == nil then
|
||||
elseif node._type == nil then
|
||||
elseif node._type == "gun" then
|
||||
istack = ItemStack(stack .. "_" ..
|
||||
weapons.player_list[player:get_player_name()].team ..
|
||||
" 1")
|
||||
elseif node._type == "tool" then
|
||||
istack = ItemStack(stack .. "_" ..
|
||||
weapons.player_list[player:get_player_name()].team ..
|
||||
" 1")
|
||||
end
|
||||
p_inv:add_item("main", istack)
|
||||
end
|
||||
player:hud_set_hotbar_itemcount(#medic.items)
|
||||
return
|
||||
elseif class == "scout" then
|
||||
for k, stack in pairs(scout.items) do
|
||||
local istack = ItemStack(stack .. " 1")
|
||||
local node = minetest.registered_nodes[stack .. "_" ..
|
||||
weapons.player_list[player:get_player_name()].team]
|
||||
if node == nil then
|
||||
elseif node._type == nil then
|
||||
elseif node._type == "gun" then
|
||||
istack = ItemStack(stack .. "_" ..
|
||||
weapons.player_list[player:get_player_name()].team ..
|
||||
" 1")
|
||||
elseif node._type == "tool" then
|
||||
istack = ItemStack(stack .. "_" ..
|
||||
weapons.player_list[player:get_player_name()].team ..
|
||||
" 1")
|
||||
end
|
||||
p_inv:add_item("main", istack)
|
||||
end
|
||||
player:hud_set_hotbar_itemcount(#scout.items)
|
||||
return
|
||||
elseif class == "blue_flag" then
|
||||
local istack = ItemStack("weapons:flag_blue 1")
|
||||
local num_items = #weapons[weapons.player_list[player:get_player_name()].class].items
|
||||
for i=1, num_items do
|
||||
p_inv:add_item("main", istack)
|
||||
end
|
||||
player:hud_set_hotbar_itemcount(1)
|
||||
elseif class == "red_flag" then
|
||||
local istack = ItemStack("weapons:flag_red 1")
|
||||
local num_items = #weapons[weapons.player_list[player:get_player_name()].class].items
|
||||
for i=1, num_items do
|
||||
p_inv:add_item("main", istack)
|
||||
end
|
||||
player:hud_set_hotbar_itemcount(1)
|
||||
end
|
||||
end
|
||||
|
||||
weapons.add_class_items = add_class_items
|
||||
|
||||
local function set_player_physics(player, class)
|
||||
if class == "assault" then
|
||||
player:set_physics_override(assault.physics)
|
||||
elseif class == "marksman" then
|
||||
player:set_physics_override(marksman.physics)
|
||||
elseif class == "medic" then
|
||||
player:set_physics_override(medic.physics)
|
||||
elseif class == "scout" then
|
||||
player:set_physics_override(scout.physics)
|
||||
end
|
||||
end
|
||||
|
||||
local function set_ammo(player, class)
|
||||
if class == "assault" then
|
||||
weapons.player_list[player:get_player_name()].primary =
|
||||
minetest.registered_nodes["weapons:assault_rifle_red"]._mag
|
||||
weapons.player_list[player:get_player_name()].primary_max =
|
||||
minetest.registered_nodes["weapons:assault_rifle_red"]._mag
|
||||
weapons.player_list[player:get_player_name()].blocks = 50
|
||||
weapons.player_list[player:get_player_name()].blocks_max = 50
|
||||
elseif class == "marksman" then
|
||||
weapons.player_list[player:get_player_name()].primary =
|
||||
minetest.registered_nodes["weapons:railgun_red"]._mag
|
||||
weapons.player_list[player:get_player_name()].primary_max =
|
||||
minetest.registered_nodes["weapons:railgun_red"]._mag
|
||||
weapons.player_list[player:get_player_name()].blocks = 99
|
||||
weapons.player_list[player:get_player_name()].blocks_max = 99
|
||||
elseif class == "medic" then
|
||||
weapons.player_list[player:get_player_name()].primary =
|
||||
minetest.registered_nodes["weapons:smg_red"]._mag
|
||||
weapons.player_list[player:get_player_name()].primary_max =
|
||||
minetest.registered_nodes["weapons:smg_red"]._mag
|
||||
weapons.player_list[player:get_player_name()].blocks = 25
|
||||
weapons.player_list[player:get_player_name()].blocks_max = 25
|
||||
elseif class == "scout" then
|
||||
weapons.player_list[player:get_player_name()].primary =
|
||||
minetest.registered_nodes["weapons:shotgun_red"]._mag
|
||||
weapons.player_list[player:get_player_name()].primary_max =
|
||||
minetest.registered_nodes["weapons:shotgun_red"]._mag
|
||||
weapons.player_list[player:get_player_name()].blocks = 15
|
||||
weapons.player_list[player:get_player_name()].blocks_max = 15
|
||||
end
|
||||
end
|
||||
|
||||
weapons.set_ammo = set_ammo
|
||||
|
||||
local function set_health(player, class)
|
||||
if class == "assault" then
|
||||
weapons.player_list[player:get_player_name()].hp = assault.stats.hp
|
||||
weapons.player_list[player:get_player_name()].hp_max = assault.stats.hp
|
||||
weapons.player_list[player:get_player_name()].shield = assault.stats.shield
|
||||
weapons.player_list[player:get_player_name()].shield_max = assault.stats.shield
|
||||
elseif class == "marksman" then
|
||||
weapons.player_list[player:get_player_name()].hp = marksman.stats.hp
|
||||
weapons.player_list[player:get_player_name()].hp_max = marksman.stats.hp
|
||||
weapons.player_list[player:get_player_name()].shield = marksman.stats.shield
|
||||
weapons.player_list[player:get_player_name()].shield_max = marksman.stats.shield
|
||||
elseif class == "medic" then
|
||||
weapons.player_list[player:get_player_name()].hp = medic.stats.hp
|
||||
weapons.player_list[player:get_player_name()].hp_max = medic.stats.hp
|
||||
weapons.player_list[player:get_player_name()].shield = medic.stats.shield
|
||||
weapons.player_list[player:get_player_name()].shield_max = medic.stats.shield
|
||||
elseif class == "scout" then
|
||||
weapons.player_list[player:get_player_name()].hp = scout.stats.hp
|
||||
weapons.player_list[player:get_player_name()].hp_max = scout.stats.hp
|
||||
weapons.player_list[player:get_player_name()].shield = scout.stats.shield
|
||||
weapons.player_list[player:get_player_name()].shield_max = scout.stats.shield
|
||||
end
|
||||
end
|
||||
|
||||
weapons.set_health = set_health
|
||||
|
||||
local function set_skin(player, class)
|
||||
if class == "assault" then
|
||||
if weapons.player_list[player:get_player_name()].team == "red" then
|
||||
player:set_properties({
|
||||
visual = "mesh",
|
||||
mesh = "player_assault.x",
|
||||
textures = {
|
||||
"assault_rifle.png",
|
||||
"pickaxe.png",
|
||||
"assault_class_red.png",
|
||||
},
|
||||
visual_size = {x=1.05, y=1.05},
|
||||
nametag = ""
|
||||
})
|
||||
elseif weapons.player_list[player:get_player_name()].team == "blue" then
|
||||
player:set_properties({
|
||||
visual = "mesh",
|
||||
mesh = "player_assault.x",
|
||||
textures = {
|
||||
"assault_rifle.png",
|
||||
"pickaxe.png",
|
||||
"assault_class_blue.png",
|
||||
},
|
||||
visual_size = {x=1.05, y=1.05},
|
||||
nametag = ""
|
||||
})
|
||||
end
|
||||
elseif class == "marksman" then
|
||||
if weapons.player_list[player:get_player_name()].team == "red" then
|
||||
player:set_properties({
|
||||
visual = "mesh",
|
||||
mesh = "player_assault.x",
|
||||
textures = {
|
||||
"assault_rifle.png",
|
||||
"pickaxe.png",
|
||||
"assault_class_red.png",
|
||||
},
|
||||
visual_size = {x=1.05, y=1.05},
|
||||
nametag = ""
|
||||
})
|
||||
elseif weapons.player_list[player:get_player_name()].team == "blue" then
|
||||
player:set_properties({
|
||||
visual = "mesh",
|
||||
mesh = "player_assault.x",
|
||||
textures = {
|
||||
"assault_rifle.png",
|
||||
"pickaxe.png",
|
||||
"assault_class_blue.png",
|
||||
},
|
||||
visual_size = {x=1.05, y=1.05},
|
||||
nametag = ""
|
||||
})
|
||||
end
|
||||
elseif class == "medic" then
|
||||
if weapons.player_list[player:get_player_name()].team == "red" then
|
||||
player:set_properties({
|
||||
visual = "mesh",
|
||||
mesh = "player_assault.x",
|
||||
textures = {
|
||||
"assault_rifle.png",
|
||||
"pickaxe.png",
|
||||
"assault_class_blue.png",
|
||||
},
|
||||
visual_size = {x=1.05, y=1.05},
|
||||
nametag = ""
|
||||
})
|
||||
elseif weapons.player_list[player:get_player_name()].team == "blue" then
|
||||
player:set_properties({
|
||||
visual = "mesh",
|
||||
mesh = "player_assault.x",
|
||||
textures = {
|
||||
"assault_rifle.png",
|
||||
"pickaxe.png",
|
||||
"assault_class_blue.png",
|
||||
},
|
||||
visual_size = {x=1.05, y=1.05},
|
||||
nametag = ""
|
||||
})
|
||||
end
|
||||
elseif class == "scout" then
|
||||
if weapons.player_list[player:get_player_name()].team == "red" then
|
||||
player:set_properties({
|
||||
visual = "mesh",
|
||||
mesh = "player_assault.x",
|
||||
textures = {
|
||||
"assault_rifle.png",
|
||||
"pickaxe.png",
|
||||
"assault_class_red.png",
|
||||
},
|
||||
visual_size = {x=1.05, y=1.05},
|
||||
nametag = ""
|
||||
})
|
||||
elseif weapons.player_list[player:get_player_name()].team == "blue" then
|
||||
player:set_properties({
|
||||
visual = "mesh",
|
||||
mesh = "player_assault.x",
|
||||
textures = {
|
||||
"assault_rifle.png",
|
||||
"pickaxe.png",
|
||||
"assault_class_blue.png",
|
||||
},
|
||||
visual_size = {x=1.05, y=1.05},
|
||||
nametag = ""
|
||||
})
|
||||
end
|
||||
end
|
||||
player:set_animation({x=0, y=159}, 60, 0.1, true)
|
||||
end
|
||||
|
||||
weapons.set_health = set_health
|
||||
|
||||
weapons.force_anim_group = {}
|
||||
weapons.force_anim_set = {}
|
||||
|
||||
local anim_lock = {}
|
||||
local anim_frame = {}
|
||||
local anim_press = {}
|
||||
local look_pitch = {}
|
||||
local last_anim = {}
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
-- Clear old invs first:
|
||||
clear_inv(player)
|
||||
local pname = player:get_player_name()
|
||||
weapons.player_list[pname] = {}
|
||||
minetest.show_formspec(pname, "class_select", weapons.class_formspec)
|
||||
weapons.assign_team(player, nil)
|
||||
player:set_nametag_attributes({
|
||||
color = "#00000000"
|
||||
})
|
||||
|
||||
local red = 207-35
|
||||
local red2 = 207-42
|
||||
local y = weapons.red_base_y
|
||||
player:hud_add({
|
||||
hud_elem_type = "waypoint",
|
||||
name = "Red Base",
|
||||
text = "m",
|
||||
number = weapons.teams.red_colour,
|
||||
world_pos = {x=red, y=y, z=red}
|
||||
})
|
||||
|
||||
local blu = 147-4
|
||||
local blu2 = 192-42
|
||||
y = weapons.blu_base_y
|
||||
player:hud_add({
|
||||
hud_elem_type = "waypoint",
|
||||
name = "Blue Base",
|
||||
text = "m",
|
||||
number = weapons.teams.blue_colour,
|
||||
world_pos = {x=-blu, y=y, z=-blu}
|
||||
})
|
||||
weapons.respawn_player(player, false)
|
||||
weapons.update_blue_flag = true
|
||||
weapons.update_red_flag = true
|
||||
player:set_eye_offset({x=0,y=0,z=0}, {x=15,y=-1,z=20})
|
||||
player:set_properties({
|
||||
textures = {"transparent.png", "transparent.png"}
|
||||
})
|
||||
anim_lock[pname] = false
|
||||
anim_frame[pname] = -1
|
||||
anim_press[pname] = "none"
|
||||
look_pitch[pname] = -1000
|
||||
last_anim[pname] = {x=-1, y=-1}
|
||||
end)
|
||||
|
||||
function weapons.player.set_class(player, class)
|
||||
-- Clear inv:
|
||||
clear_inv(player)
|
||||
--set_player_physics(player, class)
|
||||
set_health(player, class)
|
||||
weapons.player_list[player:get_player_name()].class = class
|
||||
set_skin(player, class)
|
||||
set_ammo(player, class)
|
||||
add_class_items(player, class)
|
||||
weapons.update_health(player)
|
||||
end
|
||||
|
||||
minetest.register_chatcommand("class", {
|
||||
description = "Choose a class.",
|
||||
func = function(name, param)
|
||||
local player = minetest.get_player_by_name(name)
|
||||
local pos = player:get_pos()
|
||||
local pos2
|
||||
if weapons.player_list[player:get_player_name()].team == "red" then
|
||||
pos2 = {x=207-35, y=weapons.red_base_y, z=207-35}
|
||||
else
|
||||
pos2 = {x=-143, y=weapons.blu_base_y, z=-143}
|
||||
end
|
||||
local result = solarsail.util.functions.pos_to_dist(pos, pos2)
|
||||
print(result)
|
||||
if result < 5.5 then
|
||||
minetest.show_formspec(name, "class_select", weapons.class_formspec)
|
||||
else
|
||||
minetest.chat_send_player(name, "You can only change class at your team's base!")
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_on_player_receive_fields(function(player,
|
||||
formname, fields)
|
||||
if formname == "class_select" then
|
||||
if fields.assault then
|
||||
weapons.player.set_class(player, "assault")
|
||||
weapons.player.cancel_reload(player)
|
||||
elseif fields.marksman then
|
||||
weapons.player.set_class(player, "marksman")
|
||||
weapons.player.cancel_reload(player)
|
||||
elseif fields.medic then
|
||||
weapons.player.set_class(player, "medic")
|
||||
weapons.player.cancel_reload(player)
|
||||
elseif fields.scout then
|
||||
weapons.player.set_class(player, "scout")
|
||||
weapons.player.cancel_reload(player)
|
||||
elseif fields.quit then
|
||||
minetest.after(0.1, minetest.show_formspec,
|
||||
player:get_player_name(), "class_select",
|
||||
weapons.class_formspec)
|
||||
return
|
||||
end
|
||||
player:set_bone_position("Armature_Legs", {x=0, y=6, z=0}, {x=180, y=0, z=0})
|
||||
player:set_bone_position("Armature_Root", {x = 0, y = 4.5, z = 0}, {x = 0, y = 0, z = 0})
|
||||
minetest.close_formspec(player:get_player_name(), "class_select")
|
||||
end
|
||||
end)
|
||||
|
||||
local function unlock_anim(pname)
|
||||
anim_lock[pname] = false
|
||||
anim_frame[pname] = -1
|
||||
anim_press[pname] = "none"
|
||||
end
|
||||
|
||||
local update_count = 0
|
||||
local update_look = 0
|
||||
|
||||
local animation_table = {}
|
||||
|
||||
animation_table.gun = {}
|
||||
animation_table.gun.idle = {x=0, y=159}
|
||||
animation_table.gun.up = {x=170, y=249}
|
||||
animation_table.gun.left = {x=260, y=339}
|
||||
animation_table.gun.right = {x=350, y=430}
|
||||
animation_table.gun.down = {x=440, y=519}
|
||||
|
||||
animation_table.pickaxe = {}
|
||||
animation_table.pickaxe.idle = {x=530, y=689}
|
||||
animation_table.pickaxe.up = {x=700, y=779}
|
||||
animation_table.pickaxe.left = {x=790, y=869}
|
||||
animation_table.pickaxe.right = {x=880, y=959}
|
||||
animation_table.pickaxe.down = {x=970, y=1049}
|
||||
|
||||
animation_table.pickaxe_swing = {}
|
||||
animation_table.pickaxe_swing.idle = {x=1060, y=1219}
|
||||
animation_table.pickaxe_swing.up = {x=1230, y=1309}
|
||||
animation_table.pickaxe_swing.left = {x=1320, y=1399}
|
||||
animation_table.pickaxe_swing.right = {x=1410, y=1489}
|
||||
animation_table.pickaxe_swing.down = {x=1500, y=1579}
|
||||
|
||||
animation_table.pickaxe_alt = {}
|
||||
animation_table.pickaxe_alt_swing = {}
|
||||
animation_table.block = {}
|
||||
animation_table.block_place = {}
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
for _, player in ipairs(minetest.get_connected_players()) do
|
||||
local pname = player:get_player_name()
|
||||
local wield = player:get_wielded_item():get_name()
|
||||
local weapon = minetest.registered_nodes[wield]
|
||||
local ppitch = -math.deg(player:get_look_vertical())
|
||||
local frame_offset = 0
|
||||
local anim_group, anim_set
|
||||
|
||||
if look_pitch[pname] ~= ppitch then
|
||||
player:set_bone_position("Armature_Upper_Body", {x = 0, y = 4, z = 0}, {x = ppitch * 0.6, y = 0, z = 0})
|
||||
player:set_bone_position("Armature_Head", {x = 0, y = 3, z = 0}, {x = ppitch * 0.25, y = 0, z = 0})
|
||||
look_pitch[pname] = ppitch
|
||||
--update_look = update_look + 2
|
||||
end
|
||||
|
||||
if anim_frame[pname] ~= -1 then
|
||||
anim_frame[pname] = anim_frame[pname] + dtime
|
||||
frame_offset = math.floor(anim_frame[pname] * 60)
|
||||
end
|
||||
if solarsail.controls.player[pname] == nil then
|
||||
elseif solarsail.controls.player[pname].left then
|
||||
anim_group = "left"
|
||||
elseif solarsail.controls.player[pname].right then
|
||||
anim_group = "right"
|
||||
elseif solarsail.controls.player[pname].up then
|
||||
anim_group = "up"
|
||||
elseif solarsail.controls.player[pname].down then
|
||||
anim_group = "down"
|
||||
else
|
||||
anim_group = "idle"
|
||||
end
|
||||
|
||||
if weapon == nil then
|
||||
elseif weapon._type == nil then
|
||||
elseif weapon._type == "gun" or weapon._type == "rocket" then
|
||||
anim_set = "gun"
|
||||
elseif weapon._type == "tool" then
|
||||
if solarsail.controls.player[pname].LMB or anim_lock[pname] then
|
||||
anim_set = "pickaxe_swing"
|
||||
if not anim_lock[pname] then
|
||||
anim_lock[pname] = true
|
||||
anim_frame[pname] = 0
|
||||
minetest.after(1.33, unlock_anim, pname)
|
||||
end
|
||||
else
|
||||
anim_set = "pickaxe"
|
||||
end
|
||||
elseif weapon._type == "tool_alt" then
|
||||
elseif weapon._type == "block" then
|
||||
elseif weapon._type == "flag" then
|
||||
end
|
||||
|
||||
-- Only do animations when we have a valid animation
|
||||
if anim_set == nil then
|
||||
elseif anim_group == nil then
|
||||
else
|
||||
-- Avoid aliasing the original animation table and screwing it up for everyone.
|
||||
local result_frames = table.copy(animation_table[anim_set][anim_group])
|
||||
|
||||
-- Only increment the animation start frames when we have an uncancelable animation
|
||||
if frame_offset ~= 0 then
|
||||
result_frames.x = result_frames.x + frame_offset
|
||||
end
|
||||
|
||||
-- Prevent re-sending packets to clients with the exact frames again.
|
||||
if last_anim[pname].x ~= result_frames.x then
|
||||
player:set_animation(result_frames, 60, 0.1, true)
|
||||
-- Once again, avoid aliasing and getting a potentially GC'd frame range
|
||||
last_anim[pname] = table.copy(result_frames)
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
local function update_print()
|
||||
print(update_count, update_look)
|
||||
update_count = 0
|
||||
update_look = 0
|
||||
--minetest.after(10, update_print)
|
||||
end
|
||||
|
||||
--minetest.after(10, update_print)
|
|
@ -0,0 +1,99 @@
|
|||
-- Rocket Science for Super CTF:
|
||||
-- Author: Jordach
|
||||
-- License: Reserved
|
||||
|
||||
local rocket_ent = {
|
||||
visual = "mesh",
|
||||
mesh = "rocket_ent.obj",
|
||||
textures = {
|
||||
"core_cobble.png",
|
||||
},
|
||||
physical = true,
|
||||
collide_with_objects = true,
|
||||
pointable = false,
|
||||
collision_box = {-0.15, -0.15, -0.15, 0.15, 0.15, 0.15},
|
||||
visual_size = {x=5, y=5},
|
||||
_player_ref = nil,
|
||||
_loop_sound_ref = nil,
|
||||
_timer = 0
|
||||
}
|
||||
|
||||
function rocket_ent:explode(self, moveresult)
|
||||
local pos = self.object:get_pos()
|
||||
local pos_block
|
||||
if moveresult.collisions[1] == nil then
|
||||
pos_block = table.copy(self.object:get_pos())
|
||||
pos_block.x = math.floor(pos_block.x)
|
||||
pos_block.y = math.floor(pos_block.y)
|
||||
pos_block.z = math.floor(pos_block.z)
|
||||
elseif moveresult.collisions[1].type == "object" then
|
||||
if moveresult.collisions[1].object:get_pos() ~= nil then
|
||||
pos_block = table.copy(moveresult.collisions[1].object:get_pos())
|
||||
pos_block.x = math.floor(pos_block.x)
|
||||
pos_block.y = math.floor(pos_block.y)
|
||||
pos_block.z = math.floor(pos_block.z)
|
||||
else
|
||||
pos_block = table.copy(pos)
|
||||
pos_block.x = math.floor(pos_block.x)
|
||||
pos_block.y = math.floor(pos_block.y)
|
||||
pos_block.z = math.floor(pos_block.z)
|
||||
end
|
||||
elseif moveresult.collisions[1].type == "node" then
|
||||
pos_block = table.copy(moveresult.collisions[1].node_pos)
|
||||
else
|
||||
pos_block = table.copy(pos)
|
||||
pos_block.x = math.floor(pos_block.x)
|
||||
pos_block.y = math.floor(pos_block.y)
|
||||
pos_block.z = math.floor(pos_block.z)
|
||||
end
|
||||
|
||||
local node = minetest.registered_nodes[minetest.get_node(pos).name]
|
||||
local rocket = minetest.registered_nodes["weapons:assault_rifle_alt_red"]
|
||||
local rocket_damage = table.copy(rocket)
|
||||
for _, player in ipairs(minetest.get_connected_players()) do
|
||||
local ppos = player:get_pos()
|
||||
local dist = solarsail.util.functions.pos_to_dist(pos, ppos)
|
||||
if dist < 4.01 then
|
||||
if player == self._player_ref then
|
||||
rocket_damage._damage = rocket._damage/2.5
|
||||
weapons.handle_damage(rocket_damage, self._player_ref, player, dist)
|
||||
else
|
||||
dist = solarsail.util.functions.pos_to_dist(self._player_ref:get_pos(), ppos)
|
||||
weapons.handle_damage(rocket_damage, self._player_ref, player, dist)
|
||||
end
|
||||
-- Add player knockback:
|
||||
solarsail.util.functions.apply_explosion_recoil(player, 25, pos)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
worldedit.sphere(pos_block, 1, "air", false)
|
||||
for i=1, 25 do
|
||||
minetest.add_particle({
|
||||
pos = pos,
|
||||
velocity = {x=math.random()*2.5, y=math.random()*2.5, z=math.random()*2.5},
|
||||
expirationtime = 4,
|
||||
collisiondetection = true,
|
||||
collision_removal = false,
|
||||
texture = "rocket_smoke_"..math.random(1,3)..".png",
|
||||
size = math.random(5, 12)
|
||||
})
|
||||
end
|
||||
minetest.sound_play({name="rocket_explode"},
|
||||
{pos=pos_block, max_hear_distance=64, gain=7}, true)
|
||||
if self._loop_sound_ref ~= nil then
|
||||
minetest.sound_stop(self._loop_sound_ref)
|
||||
end
|
||||
self.object:remove()
|
||||
end
|
||||
|
||||
function rocket_ent:on_step(dtime, moveresult)
|
||||
if moveresult.collides then
|
||||
rocket_ent:explode(self, moveresult)
|
||||
elseif self._timer > 15 then
|
||||
rocket_ent:explode(self, moveresult)
|
||||
end
|
||||
self._timer = self._timer + dtime
|
||||
end
|
||||
|
||||
minetest.register_entity("weapons:rocket_ent", rocket_ent)
|
|
@ -0,0 +1,43 @@
|
|||
-- Skybox for Super CTF:
|
||||
-- Author: Jordach
|
||||
-- License: Reserved
|
||||
|
||||
local day_sky = "#c5b7ea"
|
||||
local day_horizon = "#f0ecff"
|
||||
local dawn_sky = "#bf9bb4"
|
||||
local dawn_horizon = "#dec6d7"
|
||||
local night_sky = "#5400ff"
|
||||
local night_horizon = "#4f2a9b"
|
||||
local sun_tint = "#dbbae7"
|
||||
local moon_tint = "#d37dff"
|
||||
|
||||
local cloud_color = "#f3eaf8e7"
|
||||
local star_color = "#c0c7ffaa"
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
player:set_sky({
|
||||
type = "regular",
|
||||
clouds = true,
|
||||
sky_color = {
|
||||
day_sky = day_sky,
|
||||
day_horizon = day_horizon,
|
||||
dawn_sky = dawn_sky,
|
||||
dawn_horizon = dawn_horizon,
|
||||
night_sky = night_sky,
|
||||
night_horizon = night_horizon,
|
||||
fog_sun_tint = sun_tint,
|
||||
fog_moon_tint = moon_tint,
|
||||
fog_tint_type = "custom"
|
||||
}
|
||||
})
|
||||
|
||||
player:set_clouds({
|
||||
color = cloud_color
|
||||
})
|
||||
|
||||
player:set_stars({
|
||||
count = 2000,
|
||||
star_color = star_color,
|
||||
scale = 0.65
|
||||
})
|
||||
end)
|
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 4.7 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 8.7 KiB |
After Width: | Height: | Size: 5.1 KiB |
After Width: | Height: | Size: 5.0 KiB |
After Width: | Height: | Size: 3.9 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 456 B |
After Width: | Height: | Size: 562 B |
After Width: | Height: | Size: 717 B |
After Width: | Height: | Size: 157 B |
After Width: | Height: | Size: 157 B |
After Width: | Height: | Size: 157 B |
After Width: | Height: | Size: 910 B |
After Width: | Height: | Size: 921 B |
After Width: | Height: | Size: 614 B |
After Width: | Height: | Size: 492 B |
After Width: | Height: | Size: 571 B |
After Width: | Height: | Size: 377 B |
After Width: | Height: | Size: 476 B |
After Width: | Height: | Size: 274 B |
After Width: | Height: | Size: 271 B |
After Width: | Height: | Size: 345 B |
After Width: | Height: | Size: 489 B |
After Width: | Height: | Size: 324 B |
After Width: | Height: | Size: 582 B |
After Width: | Height: | Size: 390 B |
After Width: | Height: | Size: 484 B |
After Width: | Height: | Size: 643 B |
After Width: | Height: | Size: 379 B |
After Width: | Height: | Size: 553 B |