From 15daa210c496232caa110e32bfb61bfb54e13183 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 14 Jul 2014 17:55:48 +0200 Subject: [PATCH] Add effect failure The apply function of effects can return false, in that case, the effect is not applied --- examples.lua | 26 +++++++++++++++++++++++++- init.lua | 12 ++++++++++-- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/examples.lua b/examples.lua index ce3fbcd..ba798f7 100644 --- a/examples.lua +++ b/examples.lua @@ -1,4 +1,13 @@ ----- EXAMPLE EFFECT TYPES ----- +--[[ Null effect. The apply function always returns false, which means applying the +effect will never succeed ]] +playereffects.register_effect_type("null", "No effect", nil, {}, + function() + return false + end +) + + -- Makes the player screen black for 5 seconds (very experimental!) playereffects.register_effect_type("blind", "Blind", nil, {}, function(player) @@ -8,7 +17,12 @@ playereffects.register_effect_type("blind", "Blind", nil, {}, scale = { x=-100, y=-100 }, text = "playereffects_example_black.png", }) - return { hudid = hudid } + if(hudid ~= nil) then + return { hudid = hudid } + else + minetest.log("error", "[playereffects] [examples] The effect \"Blind\" could not be applied. The call to hud_add(...) failed.") + return false + end end, function(effect) local player = minetest.get_player_by_name(effect.playername) @@ -91,6 +105,16 @@ playereffects.register_effect_type("stress", "Stress Test Effect", nil, {}, ------ Chat commands for the example effects ------ +-- Null effect (never succeeds) +minetest.register_chatcommand("null", { + params = "", + description = "Does nothing.", + privs = {}, + func = function(name, param) + playereffects.apply_effect_type("null", 5, minetest.get_player_by_name(name)) + end, +}) + minetest.register_chatcommand("blind", { params = "", description = "Makes your screen black for a short time.", diff --git a/init.lua b/init.lua index a7b7b88..0b6b0eb 100644 --- a/init.lua +++ b/init.lua @@ -69,7 +69,17 @@ end function playereffects.apply_effect_type(effect_type_id, duration, player) local start_time = os.time() + local status = playereffects.effect_types[effect_type_id].apply(player) local playername = player:get_player_name() + local metadata + + if(status == false) then + minetest.log("action", "[playereffects] Attempt to apply effect type "..effect_type_id.." to player "..playername.." failed!") + return + else + metadata = status + end + local groups = playereffects.effect_types[effect_type_id].groups for k,v in pairs(groups) do playereffects.cancel_effect_group(v, playername) @@ -105,8 +115,6 @@ function playereffects.apply_effect_type(effect_type_id, duration, player) hudids = {text_id=nil, icon_id=nil} end - local metadata = playereffects.effect_types[effect_type_id].apply(player) - local effect = { playername = playername, effect_id = effect_id,