master
runs 2021-01-02 00:46:51 +01:00
parent 9d106b8fb0
commit 9af6b01752
5 changed files with 67 additions and 20 deletions

3
LICENSE.md Normal file
View File

@ -0,0 +1,3 @@
#License
- Code: GPLv3

View File

@ -21,9 +21,10 @@ local function deepCopy(original)
return copy
end
local function enable_steal(clicker, clicked, rob_table)
local function enable_steal(clicker, clicked, rob_table, angle_2d)
local steal_table = {}
steal_table["clicked"] = clicked:get_player_name()
steal_table["angle_2d"] = angle_2d
steal_table["items"] = deepCopy(rob_table)
_contexts[clicker:get_player_name()] = steal_table
end
@ -112,7 +113,7 @@ local function get_rob_list(clicked)
.. item_name .. ";item_name;"..tostring(i).."]"
end
end
minetest.chat_send_all("rob_list="..rob_list)
--minetest.chat_send_all("rob_list="..rob_list)
return rob_list, list_hotbar
end
@ -123,6 +124,27 @@ local function get_formspec(clicker, clicked, rob_list)
return formspec
end
local function get_angle(clicker, clicked)
local clicker_look_view = clicker:get_look_dir()
local x1 = clicker_look_view.x
local z1 = clicker_look_view.z
local clicked_look_view = clicked:get_look_dir()
local x2 = clicked_look_view.x
local z2 = clicked_look_view.z
return math.deg(math.acos((x1 * x2 + z1 * z2) / (math.sqrt(x1^2 + z1^2) * math.sqrt(x2^2 + z2^2))))
end
local function get_stealth_ratio(angle_2d)
if angle_2d <= pickp.settings["zone_1_2_limit"] then
stealth_ratio = pickp.settings["zone1_stealth_ratio"]
elseif angle_2d > pickp.settings["zone_1_2_limit"] and angle_2d < pickp.settings["zone_2_3_limit"] then
stealth_ratio = pickp.settings["zone2_stealth_ratio"]
else
stealth_ratio = pickp.settings["zone3_stealth_ratio"]
end
return stealth_ratio
end
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "pickp:form" then
return
@ -146,9 +168,35 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
inv_clicked:remove_item("main", final_steal_itemstack)
inv_clicker:add_item("main", final_steal_itemstack)
disable_stealth(player, true, false)
--DETECTION WARNING
--Check the angle/ratio
local angle_2d = get_angle(player, clicked)
local stealth_ratio = get_stealth_ratio(angle_2d)
local type_item_reduction_factor
if steal_itemstack.type == "main" then
type_item_reduction_factor = pickp.settings["warning_main_item"]
else
type_item_reduction_factor = pickp.settings["warning_hotbar_item"]
end
stealth_ratio = stealth_ratio - type_item_reduction_factor
else
disable_stealth(player, true, "The player has moved his items!")
end
if math.random(0,1) >= stealth_ratio then --NOT detected
minetest.chat_send_player(player:get_player_name(), S("Successful robbery!"))
else
--DETECTION WARNING
local msg = ""
local clicked_name = clicked:get_player_name()
if math.random(0,1) <= pickp.settings["warning_failed_thief_ratio"] then
msg = S("Someone has stolen from you!")
else
msg = clicked_name.." "..S("has stolen from you")
end
if not (msg == "") then
minetest.chat_send_player(clicked_name, msg)
end
end
return true
end)
@ -175,23 +223,10 @@ local function stealth(clicker, clicked)
return
end
--2) CHECK THE ANGLE
local clicker_look_view = clicker:get_look_dir()
local x1 = clicker_look_view.x
local z1 = clicker_look_view.z
local clicked_look_view = clicked:get_look_dir()
local x2 = clicked_look_view.x
local z2 = clicked_look_view.z
local angle_2d = math.deg(math.acos((x1 * x2 + z1 * z2) / (math.sqrt(x1^2 + z1^2) * math.sqrt(x2^2 + z2^2))))
local angle_2d = get_angle(clicker, clicked)
--minetest.chat_send_all(tostring(angle_2d))
local stealth_ratio
--Detect the zone -->
if angle_2d <= pickp.settings["zone_1_2_limit"] then
stealth_ratio = pickp.settings["zone1_stealth_ratio"]
elseif angle_2d > pickp.settings["zone_1_2_limit"] and angle_2d < pickp.settings["zone_2_3_limit"] then
stealth_ratio = pickp.settings["zone2_stealth_ratio"]
else
stealth_ratio = pickp.settings["zone3_stealth_ratio"]
end
local stealth_ratio = get_stealth_ratio(angle_2d)
--Detect the zone & get the ratio accordingly-->
if math.random(0,1) >= stealth_ratio then --NOT detected
minetest.after(pickp.settings["stealth_timing"], stealth, clicker, clicked)
return
@ -216,7 +251,8 @@ local function pickpocketing(clicker, clicked)
if not(rob_list == "") then
minetest.show_formspec(clicker_name,
"pickp:form", get_formspec(clicker, clicked, rob_list))
enable_steal(clicker, clicked, rob_table) --mark as stealing
local angle_2d = get_angle(clicker, clicked)
enable_steal(clicker, clicked, rob_table, angle_2d) --mark as stealing
minetest.after(pickp.settings["stealth_timing"], stealth, clicker, clicked)
else
minetest.chat_send_player(clicker_name, S("Failed robbery!"))

View File

@ -6,3 +6,5 @@ The player has moved his items!=El jugador a cambiado sus objetos de sitio
Someone has tried to steal from you!=¡Alguien ha intentado robarte!
tried to steal from you!=intentó robarte!
The victim has walked away!=¡La victima se ha alejado!
Successful robbery!=¡Robo exitoso!
Someone has stolen from you!=¡Alguien te ha robado!

View File

@ -34,5 +34,9 @@ zone2_stealth_ratio = 0.4
zone3_stealth_ratio = 0.9
#Detection Warning (0-1)
##Chance to info the victim of the thief's name
##Chance to info the victim of the thief's name if the theft failed (form closes)
warning_failed_thief_ratio = 0.5
##once the theft is perpetrated, chance to inform the victim
##it depends on the item type [main|hotbar]
warning_hotbar_item = 0.6
warning_main_item = 0.2

View File

@ -15,4 +15,6 @@ pickp.settings.zone1_stealth_ratio = tonumber(settings:get("zone1_stealth_ratio"
pickp.settings.zone2_stealth_ratio = tonumber(settings:get("zone2_stealth_ratio"))
pickp.settings.zone3_stealth_ratio = tonumber(settings:get("zone3_stealth_ratio"))
pickp.settings.warning_failed_thief_ratio = tonumber(settings:get("warning_failed_thief_ratio"))
pickp.settings.warning_hotbar_item = tonumber(settings:get("warning_hotbar_item"))
pickp.settings.warning_main_item = tonumber(settings:get("warning_main_item"))