Add subgames.register_game function

master
Lejo1 2020-06-11 21:50:56 +02:00
parent d563cd7b4e
commit e16b448e3a
10 changed files with 258 additions and 215 deletions

View File

@ -39,6 +39,14 @@ minetest.register_chatcommand("build", {
end,
})
subgames.register_game("build", {
fullname = "Build",
area = {
[1] = {x=0, y=(-10000), z=0},
[2] = {x=0, y=(-10000), z=0}
},
})
minetest.register_privilege("invs", "Allows you to be fully invisible!")
function core.send_join_message(name)

View File

@ -6,6 +6,22 @@ dofile(minetest.get_modpath("hiddenseeker") .."/kits.lua")
dofile(minetest.get_modpath("hiddenseeker") .."/ingame.lua")
dofile(minetest.get_modpath("hiddenseeker") .."/commands.lua")
subgames.register_game("hiddenseeker", {
fullname = "Hide and Seek",
object = hiddenseeker,
area = {
[1] = {x=0, y=(-10000), z=0},
[2] = {x=0, y=(-10000), z=0}
},
node_dig = function(pos, node, digger)
return false
end,
item_place_node = function(itemstack, placer, pointed_thing, param2)
return false
end,
remove_player = hiddenseeker.remove_player_kits
})
hiddenseeker.lobbys = {
[1] = {
["string_name"] = "Hide and Seek Karsthafen",
@ -106,14 +122,6 @@ subgames.register_on_leaveplayer(function(player, lobby)
end
end)
function areas.hiddenseeker.dig(pos, node, digger)
return false
end
function areas.hiddenseeker.place(itemstack, placer, pointed_thing, param2)
return false
end
subgames.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage, lobby)
if lobby == "hiddenseeker" and player and hitter then
if damage == 0 then

View File

@ -12,6 +12,21 @@ minetest.register_tool("main:teleporter", {
end,
})
subgames.register_game("main", {
fullname = "Main",
object = main,
area = {
[1] = {x=(-31), y=623, z=0},
[2] = {x=9, y=595, z=39}
},
node_dig = function(pos, node, digger)
return false
end,
item_place_node = function(itemstack, placer, pointed_thing, param2)
return false
end,
})
main.teleporter_form = ""
function main.create_teleporter_form()
main.teleporter_form = ("size[4,4]" ..
@ -95,14 +110,6 @@ subgames.register_on_leaveplayer(function(player, lobby)
end
end)
function areas.main.dig(pos, node, digger)
return false
end
function areas.main.place(itemstack, placer, pointed_thing, param2)
return false
end
subgames.register_on_chat_message(function(name, message, lobby)
if lobby == "main" and name and message then
subgames.chat_send_all_lobby("main", "<"..name.."> "..message)

View File

@ -129,6 +129,50 @@ dofile(minetest.get_modpath("mesewars") .."/spawner.lua")
dofile(minetest.get_modpath("mesewars") .."/commands.lua")
dofile(minetest.get_modpath("mesewars") .."/kits.lua")
subgames.register_game("mesewars", {
fullname = "Mesewars",
object = mesewars,
area = {
[1] = {x=(-700), y=1000, z=-700},
[2] = {x=75, y=1302, z=(-17)}
},
node_dig = function(pos, node, digger)
local name = digger:get_player_name()
local plobby = mesewars.player_lobby[name]
local nodename = node.name
if mesewars.lobbys[plobby].ingame and (mesewars.lobbys[plobby].mapblocks[minetest.pos_to_string(pos)] and (nodename == "default:sandstone" or nodename == "default:obsidian" or nodename == "default:glass" or nodename == "default:steelblock" or nodename == "default:chest")) or string.find(nodename, "mesewars:mese") then
return true
end
end,
item_place_node = function(itemstack, placer, pointed_thing, param2)
local plobby
if not placer or not placer:is_player() then
plobby = get_lobby_from_pos(pos)
else local name = placer:get_player_name()
plobby = mesewars.player_lobby[name]
end
if not plobby then return end
if mesewars.lobbys[plobby].ingame then
return true
end
end,
drop = function(pos, itemname, player)
local name = player:get_player_name()
local plobby = mesewars.player_lobby[name]
if not plobby then
plobby = get_lobby_from_pos(pos)
if not plobby then
return false
end
end
if mesewars.lobbys[plobby].ingame and itemname == "default:sandstone" or itemname == "default:obsidian" or itemname == "default:glass" or itemname == "default:steelblock" or itemname == "default:chest" then
return true
else return false
end
end,
remove_player = mesewars.remove_player_kits
})
function mesewars.get_lobby_players(lobby)
local players = {}
for _, player in pairs(subgames.get_lobby_players("mesewars")) do

View File

@ -62,49 +62,12 @@ subgames.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack
end
end)
function areas.mesewars.dig(pos, node, digger)
local name = digger:get_player_name()
local plobby = mesewars.player_lobby[name]
local nodename = node.name
if mesewars.lobbys[plobby].ingame and (mesewars.lobbys[plobby].mapblocks[minetest.pos_to_string(pos)] and (nodename == "default:sandstone" or nodename == "default:obsidian" or nodename == "default:glass" or nodename == "default:steelblock" or nodename == "default:chest")) or string.find(nodename, "mesewars:mese") then
return true
end
end
function areas.mesewars.place(itemstack, placer, pointed_thing, param2)
local plobby
if not placer or not placer:is_player() then
plobby = get_lobby_from_pos(pos)
else local name = placer:get_player_name()
plobby = mesewars.player_lobby[name]
end
if not plobby then return end
if mesewars.lobbys[plobby].ingame then
return true
end
end
subgames.register_on_drop(function(itemstack, dropper, pos, lobby)
if lobby == "mesewars" then
return false
end
end)
function areas.mesewars.drop(pos, itemname, player)
local name = player:get_player_name()
local plobby = mesewars.player_lobby[name]
if not plobby then
plobby = get_lobby_from_pos(pos)
if not plobby then
return false
end
end
if mesewars.lobbys[plobby].ingame and itemname == "default:sandstone" or itemname == "default:obsidian" or itemname == "default:glass" or itemname == "default:steelblock" or itemname == "default:chest" then
return true
else return false
end
end
function mesewars.get_team_base(name)
local lobby = mesewars.player_lobby[name]
if lobby and mesewars.lobbys[lobby] and mesewars.lobbys[lobby].players[name] and mesewars.lobbys[lobby].pos[mesewars.lobbys[lobby].players[name]] then

View File

@ -164,6 +164,49 @@ dofile(minetest.get_modpath("skywars") .."/chests.lua")
dofile(minetest.get_modpath("skywars") .."/commands.lua")
dofile(minetest.get_modpath("skywars") .."/kits.lua")
subgames.register_game("skywars", {
fullname = "Skywars",
object = skywars,
area = {
[1] = {x=10000, y=1900, z=10000},
[2] = {x=(-10000), y=2900, z=(-10000)}
},
node_dig = function(pos, node, digger)
local name = digger:get_player_name()
local plobby = skywars.player_lobby[name]
if skywars.lobbys[plobby].ingame then
return true
end
end,
item_place_node = function(itemstack, placer, pointed_thing, param2)
local plobby
if not placer or not placer:is_player() then
plobby = get_lobby_from_pos(pos)
else local name = placer:get_player_name()
plobby = skywars.player_lobby[name]
end
if not plobby then return end
if skywars.lobbys[plobby].ingame then
return true
end
end,
drop = function(pos, itemname, player)
local name = player:get_player_name()
local plobby = skywars.player_lobby[name]
if not plobby then
plobby = get_lobby_from_pos(pos)
if not plobby then
return false
end
end
if skywars.lobbys[plobby].ingame then
return true
else return false
end
end,
remove_player = skywars.remove_player_kits
})
function skywars.get_lobby_players(lobby)
local players = {}
for _, player in pairs(subgames.get_lobby_players("skywars")) do

View File

@ -74,27 +74,6 @@ subgames.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack
end
end)
function areas.skywars.dig(pos, node, digger)
local name = digger:get_player_name()
local plobby = skywars.player_lobby[name]
if skywars.lobbys[plobby].ingame then
return true
end
end
function areas.skywars.place(itemstack, placer, pointed_thing, param2)
local plobby
if not placer or not placer:is_player() then
plobby = get_lobby_from_pos(pos)
else local name = placer:get_player_name()
plobby = skywars.player_lobby[name]
end
if not plobby then return end
if skywars.lobbys[plobby].ingame then
return true
end
end
subgames.register_on_drop(function(itemstack, dropper, pos, lobby)
if lobby == "skywars" then
local name = dropper:get_player_name()
@ -105,21 +84,6 @@ subgames.register_on_drop(function(itemstack, dropper, pos, lobby)
end
end)
function areas.skywars.drop(pos, itemname, player)
local name = player:get_player_name()
local plobby = skywars.player_lobby[name]
if not plobby then
plobby = get_lobby_from_pos(pos)
if not plobby then
return false
end
end
if skywars.lobbys[plobby].ingame then
return true
else return false
end
end
subgames.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage, lobby)
if lobby == "skywars" and player and hitter then
if damage == 0 then

View File

@ -13,6 +13,7 @@ function table.contains(table, element)
else return false
end
end
function subgames.concatornil(toconcat)
if type(toconcat) == "table" then
return table.concat(toconcat, ",")
@ -21,6 +22,7 @@ function subgames.concatornil(toconcat)
else return toconcat
end
end
function round(num, numDecimalPlaces)
local mult = 10^(numDecimalPlaces or 0)
return math.floor(num * mult + 0.5) / mult
@ -48,29 +50,13 @@ function is_inside_area(pos1, pos2, mainpos)
end
function subgames.get_lobby_from_pos(pos)
for lname in pairs(areas) do
if is_inside_area(areas[lname][1], areas[lname][2], pos) then
for lname, area in pairs(subgames.areas) do
if is_inside_area(area[1], area[2], pos) then
return lname
end
end
end
function subgames.check_drop(pos, itemname, player)
local name = player:get_player_name()
local lobby = player_lobby[name]
if not lobby then
lobby = subgames.get_lobby_from_pos(pos)
if not lobby then
return false
end
end
local func = areas[lobby].drop
if not func then
return false
else return func(pos, itemname, player)
end
end
function subgames.get_lobby_players(lobby)
local players = {}
for _,value in ipairs(minetest.get_connected_players()) do
@ -166,10 +152,11 @@ function subgames.remove_all_player(name)
remove_rule_accepted(name)
playtime.remove_playtime(name)
skins.remove_player(name)
hiddenseeker.remove_player_kits(name)
mesewars.remove_player_kits(name)
skywars.remove_player_kits(name)
survivalgames.remove_player_kits(name)
for _, d in pairs(subgames.games) do
if d.remove_player then
d.remove_player(name)
end
end
money.remove(name)
return true
end

View File

@ -1,9 +1,9 @@
-- This is the controll mod of Subgames for all!
subgames={}
subgames = {}
player_lobby = {}
death = {}
areas={
subgames.games = {}
subgames.areas={
["mesewars"] = {
[1] = {x=(-700), y=1000, z=-700},
[2] = {x=75, y=1302, z=(-17)}
@ -36,16 +36,39 @@ dofile(minetest.get_modpath("subgames") .."/sfinv.lua")
dofile(minetest.get_modpath("subgames") .."/functions.lua")
dofile(minetest.get_modpath("subgames") .."/map.lua")
-- Add a register on chat message
--[[
Def should be:
{
fullname = "Mesewars"
object = mesewars
area = {
[1] = {x=(-700), y=1000, z=-700},
[2] = {x=75, y=1302, z=(-17)}
}
optional...
node_dig = function(pos, node, digger)
item_place_node = function(itemstack, placer, pointed_thing, param2)
drop = function(pos, itemname, player)
remove_player = function(name)
}
]]
function subgames.register_game(name, def)
def.name = name
subgames.games[name] = def
end
-- Add a register on chat message (name, message)
subgames.on_chat_message = {}
function subgames.register_on_chat_message(func, name, message, lobby)
function subgames.register_on_chat_message(func)
table.insert(subgames.on_chat_message, func)
end
minetest.register_on_chat_message(function(name, message)
minetest.log("action", "Chatlog: "..name.." wrote:"..message)
local toreturn = nil
for _,value in pairs(subgames.on_chat_message) do
for _, value in pairs(subgames.on_chat_message) do
if value(name, message, player_lobby[name]) == true then
toreturn = true
end
@ -53,22 +76,25 @@ minetest.register_on_chat_message(function(name, message)
return toreturn
end)
-- Add a register on dieplayer
-- Add a register on dieplayer (player)
subgames.on_dieplayer = {}
function subgames.register_on_dieplayer(func, player, lobby)
function subgames.register_on_dieplayer(func)
table.insert(subgames.on_dieplayer, func)
end
minetest.register_on_dieplayer(function(player)
local name = player:get_player_name()
for _,value in pairs(subgames.on_dieplayer) do
for _, value in pairs(subgames.on_dieplayer) do
value(player, player_lobby[name])
end
end)
-- Add a register on kill player
local death = {}
local redeath = {}
-- Add a register on kill player (killer, killed)
subgames.on_kill_player = {}
function subgames.register_on_kill_player(func, killer, killed, lobby)
function subgames.register_on_kill_player(func)
table.insert(subgames.on_kill_player, func)
end
@ -92,10 +118,9 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch,
end
end)
local redeath = {}
-- Add a register on respawn player
-- Add a register on respawn player (player)
subgames.on_respawnplayer = {}
function subgames.register_on_respawnplayer(func, player, lobby)
function subgames.register_on_respawnplayer(func)
table.insert(subgames.on_respawnplayer, func)
end
@ -103,21 +128,21 @@ minetest.register_on_respawnplayer(function(player)
local name = player:get_player_name()
death[name] = nil
redeath[name] = nil
for _,value in pairs(subgames.on_respawnplayer) do
for _, value in pairs(subgames.on_respawnplayer) do
value(player, player_lobby[name])
end
end)
-- Add a register on dig node
-- Add a register on dig node (pos, oldnode, digger)
subgames.on_dignode = {}
function subgames.register_on_dignode(func, pos, oldnode, digger, lobby)
function subgames.register_on_dignode(func)
table.insert(subgames.on_dignode, func)
end
minetest.register_on_dignode(function(pos, oldnode, digger)
if digger and digger:is_player() then
local name = digger:get_player_name()
for _,value in pairs(subgames.on_dignode) do
for _, value in pairs(subgames.on_dignode) do
value(pos, oldnode, digger, player_lobby[name])
end
end
@ -132,8 +157,8 @@ function minetest.node_dig(pos, node, digger)
else lobby = subgames.get_lobby_from_pos(pos)
end
if not lobby then return end
if areas[lobby].dig then
local result = areas[lobby].dig(pos, node, digger)
if subgames.games[lobby].node_dig then
local result = subgames.games[lobby].node_dig(pos, node, digger)
if result == true then
return old_node_dig(pos, node, digger)
else return
@ -142,9 +167,9 @@ function minetest.node_dig(pos, node, digger)
end
end
-- Add a register on place node
-- Add a register on place node (pos, newnode, placer, oldnode, itemstack, pointed_thing)
subgames.on_placenode = {}
function subgames.register_on_placenode(func, pos, newnode, placer, oldnode, itemstack, pointed_thing, lobby)
function subgames.register_on_placenode(func)
table.insert(subgames.on_placenode, func)
end
@ -176,8 +201,8 @@ function minetest.item_place_node(itemstack, placer, pointed_thing, param2)
lobby = subgames.get_lobby_from_pos(pos)
end
if not lobby then return end
if areas[lobby].place then
local result = areas[lobby].place(itemstack, placer, pointed_thing, param2)
if subgames.games[lobby].item_place_node then
local result = subgames.games[lobby].item_place_node(itemstack, placer, pointed_thing, param2)
if result == true then
return old_node_place(itemstack, placer, pointed_thing, param2)
else return
@ -186,9 +211,9 @@ function minetest.item_place_node(itemstack, placer, pointed_thing, param2)
end
end
-- Add a register on punchplayer
-- Add a register on punchplayer (player, hitter, time_from_last_punch, tool_capabilities, dir, damage)
subgames.on_punchplayer = {}
function subgames.register_on_punchplayer(func, player, hitter, time_from_last_punch, tool_capabilities, dir, damage, lobby)
function subgames.register_on_punchplayer(func)
table.insert(subgames.on_punchplayer, func)
end
@ -208,9 +233,9 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch,
end
end)
-- Add a register on join player
-- Add a register on join player (player)
subgames.on_joinplayer = {}
function subgames.register_on_joinplayer(func, player)
function subgames.register_on_joinplayer(func)
table.insert(subgames.on_joinplayer, func)
end
@ -245,9 +270,9 @@ minetest.register_on_joinplayer(function(player)
subgames.call_join_callbacks(player, "main")
end)
-- Add a register on leave player
-- Add a register on leave player (player)
subgames.on_leaveplayer = {}
function subgames.register_on_leaveplayer(func, player)
function subgames.register_on_leaveplayer(func)
table.insert(subgames.on_leaveplayer, func)
end
@ -313,9 +338,9 @@ function subgames.register_chatcommand(cname, def)
end
-- Add a register on item eat
-- Add a register on item eat (hp_change, replace_with_item, itemstack, user, pointed_thing)
subgames.on_item_eat = {}
function subgames.register_on_item_eat(func, hp_change, replace_with_item, itemstack, user, pointed_thing, lobby)
function subgames.register_on_item_eat(func)
table.insert(subgames.on_item_eat, func)
end
@ -326,9 +351,9 @@ minetest.register_on_item_eat(function(hp_change, replace_with_item, itemstack,
end
end)
-- Add a register on punch node
-- Add a register on punch node (pos, node, puncher, pointed_thing)
subgames.on_punchnode = {}
function subgames.register_on_punchnode(func, pos, node, puncher, pointed_thing, lobby)
function subgames.register_on_punchnode(func)
table.insert(subgames.on_punchnode, func)
end
@ -339,8 +364,9 @@ minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing)
end
end)
-- Add a register on drop (itemstack, dropper, pos)
subgames.on_drop = {}
function subgames.register_on_drop(func, itemstack, dropper, pos, lobby)
function subgames.register_on_drop(func)
table.insert(subgames.on_drop, func)
end
local dropfuncs = {}
@ -365,9 +391,27 @@ function subgames.handle_drop(itemstack, dropper, pos)
end
end
function subgames.check_drop(pos, itemname, player)
local name = player:get_player_name()
local lobby = player_lobby[name]
if not lobby then
lobby = subgames.get_lobby_from_pos(pos)
if not lobby then
return false
end
end
local func = subgames.games[lobby].drop
if not func then
return false
else return func(pos, itemname, player)
end
end
minetest.override_item("tnt:tnt_burning", {description="TNT"})
-- Register on blas (pos, intensity)
subgames.on_blast = {}
function subgames.register_on_blast(func, pos, intensity, lobby)
function subgames.register_on_blast(func)
table.insert(subgames.on_blast, func)
end
local blastfuncs = {}
@ -414,14 +458,7 @@ minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv
end)
minetest.unregister_chatcommand("me")
minetest.register_chatcommand("crash", {
params = "",
description = "Use it to crash the server without bad followings.",
privs = {ban=true},
func = function(user)
crash.crash = crash.crash +1
end,
})
minetest.register_chatcommand("say", {
params = "",
description = "Use it to say something in the global chat.",
@ -430,34 +467,8 @@ minetest.register_chatcommand("say", {
minetest.chat_send_all(param)
end,
})
minetest.register_on_joinplayer(function(player)
player:hud_set_flags({minimap = false})
player:set_properties({zoom_fov=10})
end)
minetest.register_tool("subgames:leaver", {
description = "Game leaver",
inventory_image = "dye_red.png",
on_use = function(itemstack, user, pointed_thing)
subgames.leaver(user)
return ""
end,
on_secondary_use = function(itemstack, user, pointed_thing)
subgames.leaver(user)
return ""
end,
})
function subgames.leaver(player)
local name = player:get_player_name()
local lobby = player_lobby[name]
if lobby == "hiddenseeker" then
hiddenseeker.leave_game(player)
hiddenseeker.win(hiddenseeker.player_lobby[name])
hiddenseeker.join_game(player, 0)
elseif lobby == "skywars" then
skywars.leave_game(player)
skywars.win(skywars.player_lobby[name])
skywars.join_game(player, 0)
end
end

View File

@ -21,6 +21,47 @@ survivalgames.player_lobby = {}
survivalgames.max_players = 20
survivalgames.protectiontime = 60
subgames.register_game("survivalgames", {
fullname = "Survivalgames",
object = survivalgames,
area = {
[1] = {x=31000, y=-50, z=31000},
[2] = {x=(-31000), y=110, z=(-31000)}
},
node_dig = function(pos, node, digger)
local name = digger:get_player_name()
local plobby = survivalgames.player_lobby[name]
if name and plobby and survivalgames.lobbys[plobby].ingame then
return true
end
end,
item_place_node = function(itemstack, placer, pointed_thing, param2)
local plobby
if not placer or not placer:is_player() then
plobby = get_lobby_from_pos(pos)
else local name = placer:get_player_name()
plobby = survivalgames.player_lobby[name]
end
if not plobby then return end
if survivalgames.lobbys[plobby].protection then
if itemstack:get_name() == "tnt:tnt_burning" or itemstack:get_name() == "default:lava_source" then
return
end
end
if survivalgames.lobbys[plobby].ingame then
return true
end
end,
drop = function(pos, itemname, player)
local name = player:get_player_name()
local plobby = survivalgames.player_lobby[name]
if survivalgames.lobbys[plobby].ingame then
return true
end
end,
remove_player = survivalgames.remove_player_kits
})
function survivalgames.get_lobby_players(lobby)
local players = {}
for _, player in pairs(subgames.get_lobby_players("survivalgames")) do
@ -90,39 +131,6 @@ local function get_lobby_from_pos(pos)
end
end
function areas.survivalgames.dig(pos, node, digger)
local name = digger:get_player_name()
local plobby = survivalgames.player_lobby[name]
if name and plobby and survivalgames.lobbys[plobby].ingame then
return true
end
end
function areas.survivalgames.drop(pos, name, player)
local name = player:get_player_name()
local plobby = survivalgames.player_lobby[name]
if survivalgames.lobbys[plobby].ingame then
return true
end
end
function areas.survivalgames.place(itemstack, placer, pointed_thing, param2)
local plobby
if not placer or not placer:is_player() then
plobby = get_lobby_from_pos(pos)
else local name = placer:get_player_name()
plobby = survivalgames.player_lobby[name]
end
if not plobby then return end
if survivalgames.lobbys[plobby].protection then
if itemstack:get_name() == "tnt:tnt_burning" or itemstack:get_name() == "default:lava_source" then
return
end
end
if survivalgames.lobbys[plobby].ingame then
return true
end
end
subgames.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage, lobby)
if lobby == "survivalgames" and player and hitter then
if damage == 0 then