commit a8c1435e31b3c88ece24c407892cec94fc6e0033 Author: Andrey Stepanov Date: Thu Nov 14 13:39:02 2024 +0500 fast potion diff --git a/README.md b/README.md new file mode 100644 index 0000000..d0f8d3d --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +# Stimulators mod + +Adds a potion that gives fast privilege + +## Craft +![Craft](craft.png) \ No newline at end of file diff --git a/craft.png b/craft.png new file mode 100644 index 0000000..82e7c92 Binary files /dev/null and b/craft.png differ diff --git a/init.lua b/init.lua new file mode 100755 index 0000000..0dcff6b --- /dev/null +++ b/init.lua @@ -0,0 +1,250 @@ + +--[[ + + Copyright 2024 Andrey Stepanov + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject + to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY + KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +]]-- + +local S = minetest.get_translator("stimulators") + +local fast_secs = minetest.settings:get("stimulators.fastpotion_duration") or (2 * 60) +local timer_check = 5 -- seconds per check + +-- get player timer +local function get_timer(user) + if not user then + return + end + + local meta = user:get_meta() + if not meta then + return "" + end + + return meta:get_string("stimulators:fast_timer") or "" +end + +-- do we have fast privs +local function has_fast(name) + return minetest.get_player_privs(name).fast +end + +-- set player timer +local function set_timer(user, timer) + local meta = user:get_meta() + if not meta then + return + end + + meta:set_string("stimulators:fast_timer", timer) +end + +-- give or revoke fast priv +local function set_fast(user, set) + local name = user and user:get_player_name() + if not name then + return + end + + local privs = minetest.get_player_privs(name) + privs.fast = set + minetest.set_player_privs(name, privs) + + -- when fast removed set timer to temp position + if set ~= true then + set_timer(user, "-99") + end +end + +-- after function +local function stimulators_set_fast(user) + local name = user and user:get_player_name() + if not name then + return + end + + local timer = tonumber(get_timer(user)) or 0 + + -- if timer ran out then remove 'fast' privelage + if timer <= 0 and timer ~= -99 then + set_fast(user, nil) + return + end + + local privs = minetest.get_player_privs(name) + + -- have we already applied 'fast' privelage? + if not privs.fast then + set_fast(user, true) + end + + -- handle timer + timer = timer - timer_check + + -- show expiration message and play sound + if timer <= 10 then + minetest.chat_send_player( + name, + minetest.get_color_escape_sequence("#ff5500") + .. S("Fast timer about to expire!") + ) + minetest.sound_play( + "default_dig_dig_immediate", + {to_player = name, gain = 1.0}, + true + ) + end + + set_timer(user, timer) -- set update timer + + -- restart checks + minetest.after( + timer_check, + function() + stimulators_set_fast(user) + end + ) +end + +-- on join /leave +minetest.register_on_joinplayer( + function(player) + -- wait 2 seconds before doing fast checks on player + minetest.after( + 2.0, + function(player) + -- get player name and timer + local name = player and player:get_player_name() + if not name then + return + end + + local timer = get_timer(player) + + -- if timer is blank and player can already fast then default and return + if timer == "" and has_fast(name) then + set_timer(player, "-99") + return + end + + timer = tonumber(timer) or 0 + + -- if timer is set to default then return + if timer == -99 then + return + end + + -- if we got this far and player is fast then start contdown check + if has_fast(name) then + minetest.after( + timer_check, + function() + stimulators_set_fast(player) + end + ) + end + end, + player + ) + end +) + +-- portion item +minetest.register_node( + "stimulators:fast_potion", + { + description = S("Fast Potion"), + drawtype = "plantlike", + tiles = {"stimulators_fast_potion.png"}, + inventory_image = "stimulators_fast_potion.png", + wield_image = "stimulators_fast_potion.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.2, -0.37, -0.2, 0.2, 0.31, 0.2} + }, + groupd = {dig_immediate = 3}, + sounds = default.node_sound_glass_defaults(), + + on_use = function(itemstack, user, pointed_thing) + if user.is_fake_player then + return + end + + -- get info + local name = user:get_player_name() + local privs = minetest.get_player_privs(name) + local timer = get_timer(user) + + if privs.fast then + local msg = timer + if timer == "" or timer == "-99" then + msg = S("unlimited") + end + + minetest.chat_send_player( + name, + minetest.get_color_escape_sequence("#ffff00") + .. S("Fast already granted, @1 seconds left!", msg) + ) + return + end + + set_timer(user, fast_secs) -- set fast timer + + -- show time remaining + minetest.chat_send_player( + name, + minetest.get_color_escape_sequence("#1eff00") + .. S("Fast granted, you gave @1 seconds!", fast_secs) + ) + + stimulators_set_fast(user) -- start check + + itemstack:take_item() -- take item + + --return empty bottle + local inv = user:get_inventory() + if inv:room_for_item("main", {name = "vessels:glass_bottle"}) then + user:get_inventory():add_item("main", "vessels:glass_bottle") + else + minetest.add_item(user:get_pos(), {name = "vessels:glass_bottle"}) + end + + return itemstack + end + } +) + +-- recipe +minetest.register_craft( + { + output = "stimulators:fast_potion 3", + recipe = { + {"ethereal:etherium_dust", "farming:chili_powder", "ethereal:etherium_dust"}, + {"farming:sugar", "farming:salt_crystal", "farming:sugar" }, + {"ethereal:etherium_dust", "wine:bottle_tequila", "ethereal:etherium_dust"} + } + } +) \ No newline at end of file diff --git a/locale/stimulators.ru.tr b/locale/stimulators.ru.tr new file mode 100644 index 0000000..e7ad5a8 --- /dev/null +++ b/locale/stimulators.ru.tr @@ -0,0 +1,7 @@ +# textdomain: stimulators + +Fast Potion=Зелье ускорения +Fast timer about to expire!=Таймер ускорения скоро истечёт! +unlimited=неограниченно +Fast already granted, @1 seconds left!=Ускорение уже выдано, @1 секнуд осталось! +Fast granted, you gave @1 seconds!=Ускорение выдано, у вас @1 секунд! \ No newline at end of file diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..090b8de --- /dev/null +++ b/mod.conf @@ -0,0 +1,3 @@ +name = stimulators +description = Cool potions +depends = vessels,ethereal,farming,wine diff --git a/textures/ethereal_flight_potion.png b/textures/ethereal_flight_potion.png new file mode 100644 index 0000000..41d6abb Binary files /dev/null and b/textures/ethereal_flight_potion.png differ diff --git a/textures/stimulators_fast_potion.png b/textures/stimulators_fast_potion.png new file mode 100644 index 0000000..9394a59 Binary files /dev/null and b/textures/stimulators_fast_potion.png differ