subgames/mods/hiddenseeker/init.lua

224 lines
7.9 KiB
Lua

--[[This is the controllmod of hiddenseeker]]
hiddenseeker = {}
dofile(minetest.get_modpath("hiddenseeker") .."/start.lua")
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}
},
crafting = false,
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",
["pos"] = {x=716, y=1012, z=732},
["seekerpos"] = {x=705, y=1020.5, z=706},
["blocks"] = {"default:bookshelf", "default:stone", "default:wood", "stairs:stair_junglewood", "default:junglewood", "default:steelblock", "stairs:stair_stone", "stairs:stair_wood"},
["ingame"] = false,
["players"] = {},
["hiddingtime"] = 0,
["timetowin"] = 0,
["hidding"] = false,
["mustcreate"] = true,
["schem"] = "hide1",
["schempos"] = {x=700, y=1000, z=700}
}
}
hiddenseeker.player_lobby = {}
hiddenseeker.max_players = 20
hiddenseeker.timetowin = 300
hiddenseeker.hiddingtime = 30
hiddenseeker.timetodisquis = 5
function hiddenseeker.get_lobby_players(lobby)
local players = {}
for _, player in pairs(subgames.get_lobby_players("hiddenseeker")) do
local name = player:get_player_name()
if hiddenseeker.player_lobby[name] == lobby then
table.insert(players, player)
end
end
return players
end
minetest.register_tool("hiddenseeker:teleporter", {
description = "Hide and Seek Teleporter",
inventory_image = "dye_green.png",
on_use = function(itemstack, user, pointed_thing)
hiddenseeker.open_teleporter_form(user)
end,
on_secondary_use = function(itemstack, user, pointed_thing)
hiddenseeker.open_teleporter_form(user)
end,
})
function hiddenseeker.create_teleporter_form()
local name = player:get_player_name()
local status = {}
for lobby, table in pairs(hiddenseeker.lobbys) do
if lobby ~= 0 then
if table.ingame == true then
status[lobby] = minetest.colorize("red", "Ingame")
elseif #hiddenseeker.get_lobby_players(lobby) >= 2 then
status[lobby] = minetest.colorize("yellow", "Starting")
else status[lobby] = minetest.colorize("lime", "Waiting")
end
status[lobby] = #hiddenseeker.get_lobby_players(lobby).."/"..hiddenseeker.max_players.." "..status[lobby]
end
end
return ("size[4,4]" ..
"image_button[0,0;2,2;hideandseek.png;map1;"..status[1].."]" ..
"tooltip[map1;"..hiddenseeker.lobbys[1].string_name.."]")
end
minetest.register_on_player_receive_fields(function(player, formname, pressed)
if formname == "hiddenseeker:teleporter" then
local name = player:get_player_name()
if pressed.map1 then
hiddenseeker.leave_game(player)
minetest.chat_send_player(name, hiddenseeker.join_game(player, 1))
end
minetest.close_formspec(name, "hiddenseeker:teleporter")
end
end)
subgames.register_on_joinplayer(function(player, lobby)
if lobby == "hiddenseeker" then
local name = player:get_player_name()
hiddenseeker.join_game(player, 1)
subgames.add_mithud(player, "You joined Hide and Seek!", 0xFFFFFF, 3)
if not hiddenseeker.disguis[name] then
hiddenseeker.disguis[name] = {time=hiddenseeker.timetodisquis}
end
local privs = minetest.get_player_privs(name)
privs.armor = nil
minetest.set_player_privs(name, privs)
end
end)
subgames.register_on_leaveplayer(function(player, lobby)
if lobby == "hiddenseeker" then
local name = player:get_player_name()
local plobby = hiddenseeker.player_lobby[name]
hiddenseeker.leave_game(player)
hiddenseeker.win(plobby)
hiddenseeker.player_lobby[name] = nil
hiddenseeker.disguis[name] = nil
end
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
return
end
local name = player:get_player_name()
local hitname = hitter:get_player_name()
local plobby = hiddenseeker.player_lobby[name]
if plobby ~= hiddenseeker.player_lobby[hitname] then
minetest.kick_player(name)
minetest.kick_player(hitname)
return
end
if plobby == 0 or hiddenseeker.lobbys[plobby].players[name] == hiddenseeker.lobbys[plobby].players[hitname] or hiddenseeker.lobbys[plobby].players[name] ~= "seeker" and hiddenseeker.lobbys[plobby].players[hitname] ~= "seeker" or not hiddenseeker.lobbys[plobby].ingame then
return true
end
end
end)
subgames.register_on_dignode(function(pos, oldnode, digger, lobby)
if lobby == "hiddenseeker" then
minetest.set_node(pos, oldnode)
end
end)
function hiddenseeker.chat_send_all_lobby(lobby, msg)
for _,player in pairs(hiddenseeker.get_lobby_players(lobby)) do
local name = player:get_player_name()
minetest.chat_send_player(name, msg)
end
end
subgames.register_on_chat_message(function(name, message, lobby)
if lobby == "hiddenseeker" then
local plobby = hiddenseeker.player_lobby[name]
for aname, alobby in pairs(hiddenseeker.player_lobby) do
if alobby == plobby then
minetest.chat_send_player(aname, "<"..name.."> "..message)
end
end
return true
end
end)
subgames.register_on_drop(function(itemstack, dropper, pos, lobby)
if lobby == "hiddenseeker" then
return false
end
end)
function hiddenseeker.join_game(player, lobby)
local name = player:get_player_name()
if #hiddenseeker.get_lobby_players(lobby) >= hiddenseeker.max_players then
return "The lobby is full!"
elseif hiddenseeker.lobbys[lobby].ingame == true then
hiddenseeker.player_lobby[name] = lobby
hiddenseeker.lobbys[lobby].players[name] = "seeker"
hiddenseeker.chat_send_all_lobby(lobby, name.." is Seeker.")
subgames.clear_inv(player)
if hiddenseeker.lobbys[lobby].hidding then
player:set_pos(hiddenseeker.lobbys[lobby].seekerpos)
else player:set_pos(hiddenseeker.lobbys[lobby].pos)
subgames.add_armor(player, ItemStack("3d_armor:helmet_cactus"), ItemStack("3d_armor:chestplate_cactus"), ItemStack("3d_armor:leggings_cactus"), ItemStack("3d_armor:boots_cactus"))
player:get_inventory():add_item("main", "default:sword_steel")
end
player:set_nametag_attributes({color = {a = 0, r = 255, g = 255, b = 255}})
return "Lobby is ingame! So you are now a seeker."
else hiddenseeker.player_lobby[name] = lobby
player:set_pos(hiddenseeker.lobbys[lobby].pos)
subgames.clear_inv(player)
hiddenseeker.lobbys[lobby].players[name] = true
player:set_nametag_attributes({color = {a = 0, r = 255, g = 255, b = 255}})
sfinv.set_page(player, "hiddenseeker:kits")
hiddenseeker.win(lobby)
if hiddenseeker.lobbys[lobby].mustcreate == true then
hiddenseeker.lobbys[lobby].mustcreate = false
minetest.chat_send_all("Creating Hide and seek map, don't leave!, May lag")
local schem = minetest.get_worldpath() .. "/schems/" .. hiddenseeker.lobbys[lobby].schem .. ".mts"
minetest.place_schematic(hiddenseeker.lobbys[lobby].schempos, schem)
end
return "You joined the map "..hiddenseeker.lobbys[lobby].string_name.."!"
end
end
function hiddenseeker.leave_game(player)
local name = player:get_player_name()
local lobby = hiddenseeker.player_lobby[name]
if lobby then
hiddenseeker.lobbys[lobby].players[name] = nil
player:set_nametag_attributes({color = {a = 255, r = 255, g = 255, b = 255}})
if hiddenseeker.lobbys[lobby].ingame then
end
end
if hiddenseeker.disguis[name].enable then
hiddenseeker.disguis[name].time = hiddenseeker.timetodisquis
hiddenseeker.disguis_player(player)
end
end