first commit

master
runs 2021-07-31 01:46:16 +02:00
commit e7b11c89d2
8 changed files with 218 additions and 0 deletions

19
.luacheckrc Normal file
View File

@ -0,0 +1,19 @@
unused_args = false
allow_defined_top = true
max_line_length = false
globals = {
"minetest",
}
read_globals = {
string = {fields = {"split"}},
table = {fields = {"copy", "getn"}},
-- Builtin
"vector", "ItemStack",
"dump", "DIR_DELIM", "VoxelArea", "Settings",
-- MTG
"default", "sfinv", "creative",
}

13
LICENSE.MD Normal file
View File

@ -0,0 +1,13 @@
# LICENSE
- Code: GPLv3.0
- Sounds: See below.
## Sounds
### Warning
- ptol_warning.ogg
- Author: andersmmg
- https://freesound.org/people/andersmmg/sounds/516991/
- License: CC - This work is licensed under the Attribution License.

173
init.lua Normal file
View File

@ -0,0 +1,173 @@
--
-- Ptolomey King Protector
-- License:GPLv3
--
local modname = minetest.get_current_modname()
local S = minetest.get_translator(modname)
local modpath = minetest.get_modpath(modname)
local ptol = {}
ptol.settings = {}
ptol.players = {}
ptol.warnings = {}
local static_spawnpoint = minetest.setting_get_pos("static_spawnpoint")
--Settings
local settings = Settings(modpath .. "/ptol.conf")
ptol.settings.radius = tonumber(settings:get("radius")) or 120
ptol.settings.world_center = minetest.string_to_pos(settings:get("world_center")) or static_spawnpoint or {x=0, y=0, z=0}
ptol.settings.allowed_angle = tonumber(settings:get("allowed_angle")) or 45
ptol.settings.time = tonumber(settings:get("time")) or 1
local function player_inside_sphere(player_pos, ptol_level)
player_pos.y = player_pos.y - 1
--If sphere's centre coordinates is (cx,cy,cz) and its radius is r,
--then point (x,y,z) is in the sphere if (xcx)2+(ycy)2+(zcz)2<r2.
local distance_to_center = math.sqrt((player_pos.x - ptol.settings.world_center.x)^2+
(player_pos.y - ptol.settings.world_center.y)^2 +
(player_pos.z - ptol.settings.world_center.z)^2)
--minetest.chat_send_all(tostring(ptol_level))
if (ptol.settings.radius * ptol_level) >= distance_to_center then
return true
else
return false
end
end
--Freeze Player Code
function ptol.is_frozen(player)
return ptol.players[player:get_player_name()]
end
minetest.register_entity("ptol:freeze", {
-- This entity needs to be visible otherwise the frozen player won't be visible.
initial_properties = {
visual = "sprite",
visual_size = { x = 0, y = 0 },
textures = {"ptol_blank.png"},
physical = false, -- Disable collision
pointable = false, -- Disable selection box
makes_footstep_sound = false,
},
on_step = function(self, dtime)
local player = self.pname and minetest.get_player_by_name(self.pname)
if not player or not ptol.is_frozen(player) then
self.object:remove()
return
end
end,
set_frozen_player = function(self, player)
self.pname = player:get_player_name()
player:set_attach(self.object, "", {x = 0, y = 0, z = 0 }, { x = 0, y = 0, z = 0 })
end,
})
function ptol.freeze(player)
ptol.players[player:get_player_name()] = true
local parent = player:get_attach()
if parent and parent:get_luaentity() and
parent:get_luaentity().set_frozen_player then
-- Already attached
return
end
local obj = minetest.add_entity(player:get_pos(), "ptol:freeze")
obj:get_luaentity():set_frozen_player(player)
end
function ptol.unfreeze(player)
ptol.players[player:get_player_name()] = nil
local pname = player:get_player_name()
local objects = minetest.get_objects_inside_radius(player:get_pos(), 2)
for i=1, #objects do
local entity = objects[i]:get_luaentity()
if entity and entity.set_frozen_player and entity.pname == pname then
objects[i]:remove()
end
end
end
function ptol.show_warning(player)
local hud_id = player:hud_add({
hud_elem_type = "text",
position = {x = 0.5, y = 0.5},
offset = {x = 0, y = 0},
text = S("You have reached the limits of your world.\nTurn around and go back where you came from."),
alignment = {x = 0, y = 0}, -- center aligned
scale = {x = 100, y = 100}, -- covered later
})
ptol.warnings[player:get_player_name()] = hud_id
end
function ptol.remove_warning(player)
player:hud_remove(ptol.warnings[player:get_player_name()])
end
local timer = 0
minetest.register_globalstep(function(dtime)
timer = timer + dtime
if timer <= ptol.settings.time then
return
end
timer = 0
for _, player in pairs(minetest.get_connected_players()) do
local player_pos = player:get_pos()
local ptol_level = player:get_meta():get_int("ptol:level")
if ptol_level == 0 then
ptol_level = 1
end
--minetest.chat_send_all(tostring(ptol_level))
if not player_inside_sphere(player_pos, ptol_level) then
local dir_to_center = vector.direction(player_pos, ptol.settings.world_center)
local player_dir = player:get_look_dir()
local angle_to_center = math.deg(vector.angle(dir_to_center, player_dir))
--minetest.chat_send_all(tostring(angle_to_center))
local frozen = ptol.is_frozen(player)
--minetest.chat_send_all(tostring(angle_to_center)..":"..tostring(ptol.settings.allowed_angle))
if not(frozen) and (angle_to_center > ptol.settings.allowed_angle) then
ptol.freeze(player)
ptol.show_warning(player)
minetest.sound_play("ptol_warning", {to_player = player:get_player_name(), gain = 1.0, max_hear_distance = 10,})
--minetest.chat_send_all("freeze")
elseif frozen and ((angle_to_center <= ptol.settings.allowed_angle)) then
ptol.unfreeze(player)
ptol.remove_warning(player)
--minetest.chat_send_all("unfreeze")
end
end
end
end)
--COMMANDS
minetest.register_chatcommand("ptol", {
privs = {
server = true,
},
description = "Ptolomey Commands",
func = function(name, param)
local player_name, value
local i = 0
for word in string.gmatch(param, "([%a%d_-]+)") do
if i == 0 then
player_name = word
else
value = word
end
i = i + 1
end
local player = minetest.get_player_by_name(player_name)
if not player then
return true, "Error: The player does not exist or not online."
end
local level = tonumber(value)
if not level then
return true, "Error: Value of the level missed."
end
player:get_meta():set_int("ptol:level", level)
minetest.chat_send_player(name, "The level for "..player_name.." ".."set to".." "..value)
end,
})

2
locale/ptol.es.tr Normal file
View File

@ -0,0 +1,2 @@
# textdomain: ptol
You have reached the limits of your world.\nTurn around and go back where you came from.=Has llegado a los límites de tu mundo.\NDate la vuelta y vuelve por donde has venido.

1
mod.conf Normal file
View File

@ -0,0 +1 @@
name = ptol

10
ptol.conf Normal file
View File

@ -0,0 +1,10 @@
#Where all the concentric spheres start
world_center=(0,0,0)
#The radius between spheres
radius=256
#Timing to check if a player is in his allowed area
time=1
#The angle for a player return to his area,
##in degrees
allowed_angle=45

BIN
sounds/ptol_warning.ogg Normal file

Binary file not shown.

BIN
textures/ptol_blank.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 B