an update to solarsail with a game?

experimental class based fps
fps_game
Jordan Snelling 2020-05-21 14:07:24 +01:00
parent 16a6fa8006
commit 62dc3053b7
143 changed files with 300551 additions and 55 deletions

1
.gitignore vendored
View File

@ -4,6 +4,7 @@
.LSOverride
mods/test
mods/weapons/sounds
# Icon must end with two \r
Icon

3
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"C_Cpp.errorSquiggles": "Enabled"
}

View File

@ -1,2 +1,2 @@
name = SolarSail
disallowed_mapgens = v5,v6,carpathian,v7,fractal,valleys
disallowed_mapgens = v6

View File

@ -1,2 +1,4 @@
time_speed = 4
dedicated_server_step = 0.03
dedicated_server_step = 0.03
mapgen_limit = 256
item_entity_ttl = 1

201
mods/solarsail/colour.lua Normal file
View File

@ -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)

140
mods/solarsail/fashion.lua Normal file
View File

@ -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

View File

@ -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)

View File

@ -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")

View File

@ -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

21
mods/solarsail/save.lua Normal file
View File

@ -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
]]

View File

@ -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
}
)
)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 238 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 233 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 236 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 231 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 230 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 198 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 B

BIN
mods/weapons/base.mts Normal file

Binary file not shown.

467
mods/weapons/blocks.lua Normal file
View File

@ -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
})

1
mods/weapons/depends.txt Normal file
View File

@ -0,0 +1 @@
solarsail

199
mods/weapons/flag_blue.lua Normal file
View File

@ -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)

View File

@ -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)

198
mods/weapons/flag_red.lua Normal file
View File

@ -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)

183
mods/weapons/game.lua Normal file
View File

@ -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)

1078
mods/weapons/init.lua Normal file

File diff suppressed because it is too large Load Diff

528
mods/weapons/mapgen.lua Normal file
View File

@ -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),
})

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -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

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

View File

@ -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

View File

@ -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

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

627
mods/weapons/player.lua Normal file
View File

@ -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)

99
mods/weapons/rocketry.lua Normal file
View File

@ -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)

43
mods/weapons/skybox.lua Normal file
View File

@ -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)

BIN
mods/weapons/textures/0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
mods/weapons/textures/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
mods/weapons/textures/2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

BIN
mods/weapons/textures/3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

BIN
mods/weapons/textures/4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

BIN
mods/weapons/textures/5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

BIN
mods/weapons/textures/6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

BIN
mods/weapons/textures/7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

BIN
mods/weapons/textures/8.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
mods/weapons/textures/9.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 456 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 562 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 717 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 910 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 921 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 614 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 492 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 571 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 476 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 582 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 390 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 484 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 643 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 553 B

Some files were not shown because too many files have changed in this diff Show More