Traitor/mods/lobby/functions.lua

225 lines
8.1 KiB
Lua
Raw Normal View History

function lobby.load()
local file = io.open(minetest.get_worldpath() .. '/levels', 'r')
if file then
lobby.savedata = minetest.deserialize(file:read('*a'))
file:close()
--lobby.savedata.stats = {}
--lobby.savedata.name_2_id = {}
else
lobby.savedata = {}
lobby.savedata.IDs = {}
lobby.savedata.data = {}
2022-02-11 06:35:32 -08:00
lobby.savedata.stats = {}
lobby.savedata.name_2_id = {}
end
end
function lobby.save()
local file = io.open(minetest.get_worldpath() .. '/levels', 'w')
file:write(minetest.serialize(lobby.savedata))
file:close()
end
2021-02-06 14:15:54 -08:00
function lobby.no_drop(itemstack, dropper, pos)
return
end
2021-02-16 18:19:12 -08:00
function lobby.is_integer(input)
2021-02-17 06:14:23 -08:00
local number = tonumber(input)
2021-02-16 18:19:12 -08:00
if number then
if math.floor(number) == number then
return true
end
end
end
2021-03-15 08:45:36 -07:00
function lobby.give_xp(player, amount)
local player_attributes = player:get_meta()
local xp = player_attributes:get_float('xp') or 0
xp = xp + amount
player_attributes:set_float('xp', xp)
sfinv.set_player_inventory_formspec(player)
end
function lobby.take_xp(player, amount)
local player_attributes = player:get_meta()
local xp = player_attributes:get_float('xp')
if xp >= amount then
local xp = xp - amount
player_attributes:set_float('xp', xp)
sfinv.set_player_inventory_formspec(player)
return true
else
return false
end
end
2021-01-02 09:09:44 -08:00
function lobby.corpse_entry(pos, map_id)
2021-01-02 10:20:58 -08:00
local corpse_pos = lobby.corpses[map_id]
table.insert(corpse_pos, pos)
lobby.corpses[map_id] = corpse_pos
end
function lobby.corpse_removal(map_id)
local corpse_pos = lobby.corpses[map_id]
for key, value in pairs(corpse_pos) do
minetest.set_node(value, {name='air'})
end
2021-01-02 09:09:44 -08:00
end
2020-12-20 17:02:17 -08:00
function lobby.players_on_level(map_id)
local survivors = ''
for _, player in pairs(minetest.get_connected_players()) do
local rname = player:get_player_name()
if lobby.game[rname] == map_id then
survivors = survivors..rname..', '
end
end
return survivors
end
2021-02-06 18:18:47 -08:00
function lobby.update_maps(map_id)
2021-03-15 08:45:36 -07:00
local count = lobby.map[map_id] - 1 or 10
2021-02-06 18:18:47 -08:00
if count <= 1 then
lobby.map[map_id] = 0
lobby.corpse_removal(map_id)
for _, player in pairs(minetest.get_connected_players()) do
2021-03-15 08:45:36 -07:00
local rname = player:get_player_name()
2021-12-17 19:06:59 -08:00
if lobby.game[rname] == map_id or lobby.game[rname] == map_id..'_ghost' then
2021-03-15 08:45:36 -07:00
local player_attributes = player:get_meta()
gamer.player_set_textures(player,{'gamer_skin.png'})
player:set_nametag_attributes({
color = {a = 255, r = 255, g = 255, b = 255}
})
player:set_properties({visual_size = {x = 1, y = 1}, collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3}})
2021-12-17 19:06:59 -08:00
player:set_pos(lobby.spawn_pos)
2022-02-11 06:35:32 -08:00
player_attributes:set_string('mode', 'solo')
2021-03-15 08:45:36 -07:00
minetest.chat_send_player(rname, 'Kicking you to the lobby')
2021-02-06 18:18:47 -08:00
player:set_physics_override({speed=1})
local player_inv = player:get_inventory()
player_inv:set_list('main', {})
lobby.game[rname] = 'lobby'
end
end
2020-12-20 17:02:17 -08:00
else
2021-02-06 18:18:47 -08:00
lobby.map[map_id] = count
2020-12-20 17:02:17 -08:00
end
end
2021-01-09 08:22:12 -08:00
function lobby.vote(map_id, force)
2021-01-02 09:09:44 -08:00
local needed_votes = lobby.map[map_id] - 1
2020-12-20 17:02:17 -08:00
local actual_votes = lobby.votes[map_id]
2021-01-09 08:22:12 -08:00
if actual_votes >= needed_votes or force then
lobby.vote_timer[map_id] = -1
2020-12-20 17:02:17 -08:00
--Reset vote status and kick player with the highest score.
local high_score = 0
local kick = ''
local traitor = lobby.traitors[map_id]
for _, player in pairs(minetest.get_connected_players()) do
local rname = player:get_player_name()
if lobby.game[rname] == map_id then
local score = lobby.suspect[rname]
2021-03-15 08:45:36 -07:00
local player_attributes = player:get_meta()
2020-12-20 17:02:17 -08:00
if score > high_score then
high_score = score
kick = rname
end
lobby.suspect[rname] = 0
2020-12-21 07:39:29 -08:00
player:set_physics_override({speed=1})
2021-03-15 08:45:36 -07:00
player_attributes:set_string('voting', 'false')
2020-12-20 17:02:17 -08:00
end
end
if kick == traitor then
lobby.team_win(map_id)
elseif needed_votes == 1 and kick ~= traitor then
lobby.traitor_win(traitor, map_id)
elseif kick ~= '' then
2021-01-09 08:22:12 -08:00
lobby.message_to_level(map_id, 'The votes are in, '..kick..' will be kicked.')
2021-03-15 08:45:36 -07:00
local player = minetest.get_player_by_name(kick)
local player_attributes = player:get_meta()
player:set_nametag_attributes({
color = {a = 0, r = 255, g = 255, b = 255}
})
player:set_properties({visual_size = {x = 0, y = 0}, collisionbox = {-0.3, 0.0, -0.3, 0.3, .2, 0.3}})
player:set_physics_override({speed=1})
player_attributes:set_string('mode', 'ghost')
minetest.chat_send_player(kick, 'You were kicked, and are now a ghost. Return to the lobby with the /lobby chat command.')
lobby.game[kick] = map_id..'_ghost'
2021-01-02 11:37:32 -08:00
lobby.update_maps(map_id)
2021-01-09 08:22:12 -08:00
else
lobby.message_to_level(map_id, 'Nobody was kicked this round.')
2021-01-02 09:09:44 -08:00
end
end
end
function lobby.team_win(map_id)
2021-01-02 10:20:58 -08:00
lobby.corpse_removal(map_id)
for _, player in pairs(minetest.get_connected_players()) do
local rname = player:get_player_name()
2021-03-15 08:45:36 -07:00
if lobby.game[rname] == map_id then
lobby.give_xp(player, 25)
minetest.chat_send_player(rname, 'The traitor was defeated.')
2021-12-17 19:06:59 -08:00
player:set_pos(lobby.spawn_pos)
2021-01-02 09:09:44 -08:00
player:set_physics_override({speed=1})
local player_inv = player:get_inventory()
player_inv:set_list('main', {})
lobby.game[rname] = 'lobby'
2021-03-15 08:45:36 -07:00
elseif lobby.game[rname] == map_id..'_ghost' then
local player_attributes = player:get_meta()
gamer.player_set_textures(player,{'gamer_skin.png'})
player:set_nametag_attributes({
color = {a = 255, r = 255, g = 255, b = 255}
})
player:set_properties({visual_size = {x = 1, y = 1}, collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3}})
2021-12-17 19:06:59 -08:00
player:set_pos(lobby.spawn_pos)
2022-02-11 06:35:32 -08:00
player_attributes:set_string('mode', 'solo')
2021-03-15 08:45:36 -07:00
minetest.chat_send_player(rname, 'The traitor was defeated.')
player:set_physics_override({speed=1})
local player_inv = player:get_inventory()
player_inv:set_list('main', {})
lobby.game[rname] = 'lobby'
end
end
lobby.map[map_id] = 0
2022-02-11 06:35:32 -08:00
lobby.update_stats(map_id, '', 'team')
2022-01-09 13:43:56 -08:00
local game_data = lobby.savedata.data[map_id]
local map_name = game_data['map_name'] or map_id
2022-01-09 13:43:56 -08:00
minetest.chat_send_all('The traitor was defeated on this round in the '..map_name)
end
2021-01-04 18:31:58 -08:00
function lobby.traitor_win(traitor, map_id)
2021-01-09 08:22:12 -08:00
local player = minetest.get_player_by_name(traitor)
2021-01-02 10:20:58 -08:00
lobby.corpse_removal(map_id)
2021-03-15 08:45:36 -07:00
lobby.give_xp(player, 25)
minetest.chat_send_player(traitor, 'CONGRATULATIONS!!! You killed all the crew!')
lobby.game[traitor] = 'lobby'
2021-12-17 19:06:59 -08:00
player:set_pos(lobby.spawn_pos)
2021-01-02 09:09:44 -08:00
player:set_physics_override({speed=1})
local player_inv = player:get_inventory()
player_inv:set_list('main', {})
lobby.map[map_id] = 0
2021-02-06 14:58:54 -08:00
for _, player in pairs(minetest.get_connected_players()) do
local rname = player:get_player_name()
if lobby.game[rname] == map_id..'_ghost' or lobby.game[rname] == map_id then
2021-02-06 14:58:54 -08:00
minetest.chat_send_player(rname, 'The traitor won.')
2021-03-15 08:45:36 -07:00
local player_attributes = player:get_meta()
gamer.player_set_textures(player,{'gamer_skin.png'})
player:set_nametag_attributes({
color = {a = 255, r = 255, g = 255, b = 255}
})
player:set_properties({visual_size = {x = 1, y = 1}, collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3}})
2021-12-17 19:06:59 -08:00
player:set_pos(lobby.spawn_pos)
2022-02-11 06:35:32 -08:00
player_attributes:set_string('mode', 'solo')
2021-02-06 14:58:54 -08:00
player:set_physics_override({speed=1})
local player_inv = player:get_inventory()
player_inv:set_list('main', {})
lobby.game[rname] = 'lobby'
end
end
2022-02-11 06:35:32 -08:00
lobby.map[map_id] = 0
lobby.update_stats(map_id, '', 'traitor')
2022-01-09 13:43:56 -08:00
local game_data = lobby.savedata.data[map_id]
local map_name = game_data['map_name'] or map_id
2022-01-09 13:43:56 -08:00
minetest.chat_send_all('The traitor was victorious on this round in the '..map_name)
end