diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index 2c7c648600..9cdc5557d1 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -233,7 +233,8 @@ end local gamemodes = { "survival", - "creative" + "creative", + "spectator" } function mcl_inventory.player_set_gamemode(p,g) @@ -242,8 +243,12 @@ function mcl_inventory.player_set_gamemode(p,g) if g == "survival" then mcl_experience.setup_hud(p) mcl_experience.update(p) + mcl_hardcore.spectator_mode_disabled(p) elseif g == "creative" then mcl_experience.remove_hud(p) + mcl_hardcore.spectator_mode_disabled(p) + elseif g == "spectator" then + mcl_hardcore.spectator_mode(p) end set_inventory(p) end diff --git a/mods/ITEMS/mcl_potions/functions.lua b/mods/ITEMS/mcl_potions/functions.lua index 15be8a90c9..c7291e53b6 100644 --- a/mods/ITEMS/mcl_potions/functions.lua +++ b/mods/ITEMS/mcl_potions/functions.lua @@ -17,18 +17,36 @@ end local icon_ids = {} +-- Hardcore mode Healthbar change +local file = io.open(minetest.get_worldpath().."/hardcore_mode.txt", "r") +if file ~= nil then + hardcore_world = true +end + local function potions_set_hudbar(player) + if hardcore_world then - if EF.poisoned[player] and EF.regenerating[player] then - hb.change_hudbar(player, "health", nil, nil, "hbhunger_icon_regen_poison.png", nil, "hudbars_bar_health.png") - elseif EF.poisoned[player] then - hb.change_hudbar(player, "health", nil, nil, "hbhunger_icon_health_poison.png", nil, "hudbars_bar_health.png") - elseif EF.regenerating[player] then - hb.change_hudbar(player, "health", nil, nil, "hudbars_icon_regenerate.png", nil, "hudbars_bar_health.png") + if EF.poisoned[player] and EF.regenerating[player] then + hb.change_hudbar(player, "health", nil, nil, "hbhunger_icon_regen_poison_hardcore.png", nil, "hudbars_bar_health.png") + elseif EF.poisoned[player] then + hb.change_hudbar(player, "health", nil, nil, "hbhunger_icon_health_poison_hardcore.png", nil, "hudbars_bar_health.png") + elseif EF.regenerating[player] then + hb.change_hudbar(player, "health", nil, nil, "hudbars_icon_regenerate_hardcore.png", nil, "hudbars_bar_health.png") + else + hb.change_hudbar(player, "health", nil, nil, "hudbars_icon_health_hardcore.png", nil, "hudbars_bar_health.png") + end else - hb.change_hudbar(player, "health", nil, nil, "hudbars_icon_health.png", nil, "hudbars_bar_health.png") - end + if EF.poisoned[player] and EF.regenerating[player] then + hb.change_hudbar(player, "health", nil, nil, "hbhunger_icon_regen_poison.png", nil, "hudbars_bar_health.png") + elseif EF.poisoned[player] then + hb.change_hudbar(player, "health", nil, nil, "hbhunger_icon_health_poison.png", nil, "hudbars_bar_health.png") + elseif EF.regenerating[player] then + hb.change_hudbar(player, "health", nil, nil, "hudbars_icon_regenerate.png", nil, "hudbars_bar_health.png") + else + hb.change_hudbar(player, "health", nil, nil, "hudbars_icon_health.png", nil, "hudbars_bar_health.png") + end + end end local function potions_init_icons(player) diff --git a/mods/PLAYER/mcl_hardcore/README.md b/mods/PLAYER/mcl_hardcore/README.md new file mode 100644 index 0000000000..6b2d91a0e1 --- /dev/null +++ b/mods/PLAYER/mcl_hardcore/README.md @@ -0,0 +1,32 @@ + +## mcl_hardcore + + +A fork of: YOLO - You Only Live Once by sofar +Heavily modified by MysticTempest for MineClone2 + +A simple player-based hardcore mod. + +Players will only have one life in hardcore mode, after dying they will be placed into spectator mode. +As spectators, they will be be: unable to interact with the world, immortal, invisible, have noclip and fly, and health/hunger hudbars will be hidden. + + +Enabling: +Enabled via a "Settings" option; newly created worlds will be set to Hardcore Mode. + +Extra Note: +You only need to toggle it on when creating a hardcore world. + +After doing so; you may 'disable' it again to create non-hardcore worlds. +Hardcore mode for that world will persist after world creation, and across any "Settings" change. + + + +--------- +Code: + Author: Copyright (C) 2019 - Auke Kok + Copyright (C) 2022 - MysticTempest + License: LGPL-2.1-or-later + +Texture: + "*_hardcore.png" - derivative of PixelPerfection heart textures: CC-By SA 4.0 diff --git a/mods/PLAYER/mcl_hardcore/init.lua b/mods/PLAYER/mcl_hardcore/init.lua new file mode 100644 index 0000000000..47d1c6f7b5 --- /dev/null +++ b/mods/PLAYER/mcl_hardcore/init.lua @@ -0,0 +1,129 @@ +--[[ +Copyright (C) 2019 - Auke Kok +Copyright (C) 2022 - MysticTempest + +"mcl_hardcore" is a fork of "yolo", is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as +published by the Free Software Foundation; either version 2.1 +of the license, or (at your option) any later version. + +--]] + +-- Spectator mode: +-- Players are unable to interact with the world, invisible, have fast, fly & noclip, are immortal and their health/hunger hudbars are hidden. +-- +-- + +mcl_hardcore = {} + +-- Write Hardcore mode state to world. +function mcl_hardcore.save() + local file = io.open(minetest.get_worldpath().."/hardcore_mode.txt", "w") + if file then + file:write("Enabled") + file:close() + end + hardcore_world = true +end + + +-- Spectator mode +function mcl_hardcore.spectator_mode(player) + local meta = player:get_meta() + local player_name = player:get_player_name() + + meta:set_int("mcl_privs:interact_revoked", 1) + player:set_armor_groups({immortal=1}) + minetest.set_player_privs(player_name, {fly=true,fast=true,noclip=true,interact=nil}) + + -- Have to wait since mcl_potions clears old effects on startup. + minetest.after(3, function(player) + mcl_potions._reset_player_effects(player) -- Fix some cases of not clearing. + mcl_potions.invisiblility_func(player, null, 86400) -- Invisible for 24 hours. + hb.hide_hudbar(player, "hunger") + hb.change_hudbar(player, "health", nil, nil, "blank.png", nil, "hudbars_bar_health.png") + mcl_experience.remove_hud(player) + end, player) + if meta:get_string("gamemode") ~= "spectator" then + meta:set_string("gamemode","spectator") + end +end + +function mcl_hardcore.spectator_mode_disabled(player) + local meta = player:get_meta() + local player_name = player:get_player_name() + local privs = minetest.get_player_privs(player_name) + + + if meta:get_int("dead") == 1 and hardcore_world==true then + meta:set_string("gamemode","spectator") + minetest.chat_send_player(player_name, "You died in hardcore mode; spectator mode not disabled.") + return + else + minetest.after(3, function(player) -- Fix startup crash conflict by waiting slightly. + mcl_potions._reset_player_effects(player) + mcl_potions.invisiblility_func(player, null, 0) + hb.unhide_hudbar(player, "hunger") + meta:set_int("mcl_privs:interact_revoked", 0) + player:set_armor_groups({immortal=0}) + + -- Try to preserve privs somewhat + if meta:get_string("gamemode") == "spectator" then + meta:set_string("gamemode","") + elseif meta:get_string("gamemode") == "creative" then + privs.fast = nil + privs.noclip = nil + privs.fly = true + privs.interact = true + minetest.set_player_privs(player_name, privs) + else -- survival; only basic privs + minetest.set_player_privs(player_name, {basic_privs=true}) + end + end, player) + end +end + + +-- Hardcore mode +function mcl_hardcore.hardcore_mode(player) + local meta = player:get_meta() + local player_name = player:get_player_name() + if meta:get_int("dead") == 1 then + mcl_hardcore.spectator_mode(player) + minetest.chat_send_player(player_name, "You died in hardcore mode; rejoining as a spectator.") + end + + minetest.register_on_dieplayer(function(player, reason) + local name = player:get_player_name() + local meta = player:get_meta() + meta:set_int("dead", 1) + end) + + -- Make player a spectator on respawn in hardcore mode. + minetest.register_on_respawnplayer(function(player) + local meta = player:get_meta() + local player_name = player:get_player_name() + if meta:get_int("dead") == 1 then + mcl_hardcore.spectator_mode(player) + minetest.chat_send_player(player_name, "You died in hardcore mode; respawning as a spectator.") + end + end) +end + + +local hardcore_mode = minetest.settings:get_bool("enable_hardcore_mode", false) +--Set world state: +minetest.register_on_joinplayer(function(player) + if minetest.get_gametime() <= 5 and hardcore_mode then + mcl_hardcore.save() + else + local file = io.open(minetest.get_worldpath().."/hardcore_mode.txt", "r") + if file ~= nil then + hardcore_world = true + end + end + if hardcore_world then + mcl_hardcore.hardcore_mode(player) + end + +end) diff --git a/mods/PLAYER/mcl_hardcore/mod.conf b/mods/PLAYER/mcl_hardcore/mod.conf new file mode 100644 index 0000000000..b760103f5c --- /dev/null +++ b/mods/PLAYER/mcl_hardcore/mod.conf @@ -0,0 +1,4 @@ +name = mcl_hardcore +license = LGPL-2.1 +description = Hardcore mode - death is permanent. A fork of sofar's YOLO mod. +depends = mcl_potions, hudbars, mcl_inventory diff --git a/mods/PLAYER/mcl_hardcore/textures/hbhunger_icon_health_poison_hardcore.png b/mods/PLAYER/mcl_hardcore/textures/hbhunger_icon_health_poison_hardcore.png new file mode 100644 index 0000000000..b1983b8c0c Binary files /dev/null and b/mods/PLAYER/mcl_hardcore/textures/hbhunger_icon_health_poison_hardcore.png differ diff --git a/mods/PLAYER/mcl_hardcore/textures/hbhunger_icon_regen_poison_hardcore.png b/mods/PLAYER/mcl_hardcore/textures/hbhunger_icon_regen_poison_hardcore.png new file mode 100644 index 0000000000..fb1e979f9d Binary files /dev/null and b/mods/PLAYER/mcl_hardcore/textures/hbhunger_icon_regen_poison_hardcore.png differ diff --git a/mods/PLAYER/mcl_hardcore/textures/hudbars_icon_health_hardcore.png b/mods/PLAYER/mcl_hardcore/textures/hudbars_icon_health_hardcore.png new file mode 100644 index 0000000000..47e8b326a7 Binary files /dev/null and b/mods/PLAYER/mcl_hardcore/textures/hudbars_icon_health_hardcore.png differ diff --git a/mods/PLAYER/mcl_hardcore/textures/hudbars_icon_regenerate_hardcore.png b/mods/PLAYER/mcl_hardcore/textures/hudbars_icon_regenerate_hardcore.png new file mode 100644 index 0000000000..db1a11765d Binary files /dev/null and b/mods/PLAYER/mcl_hardcore/textures/hudbars_icon_regenerate_hardcore.png differ diff --git a/settingtypes.txt b/settingtypes.txt index 39dbc2e90b..8bb80df123 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -42,6 +42,16 @@ mcl_tnt_griefing (TNT destroys blocks) bool true # Comma separated list of disabled structure names mcl_disabled_structures (Disabled structures) string +# If enabled, newly created worlds will be in Hardcore Mode. +# +# In this mode; you will only have 1 life to use. +# After death you will be dropped into spectator mode, and will be unable to interact with the world. +# +# Extra Note: +# After creating your HC world; you may set this back to disabled to create non-HC worlds. +# As Hardcore Mode is saved to the world, and will persist across any settings change. +enable_hardcore_mode (Enable Hardcore mode) bool false + [Players] # If enabled, players respawn at the bed they last lay on instead of normal # spawn.