From e7b11c89d257c4f331009aade79eee3f63111281 Mon Sep 17 00:00:00 2001 From: runs Date: Sat, 31 Jul 2021 01:46:16 +0200 Subject: [PATCH] first commit --- .luacheckrc | 19 +++++ LICENSE.MD | 13 +++ init.lua | 173 ++++++++++++++++++++++++++++++++++++++++ locale/ptol.es.tr | 2 + mod.conf | 1 + ptol.conf | 10 +++ sounds/ptol_warning.ogg | Bin 0 -> 23715 bytes textures/ptol_blank.png | Bin 0 -> 163 bytes 8 files changed, 218 insertions(+) create mode 100644 .luacheckrc create mode 100644 LICENSE.MD create mode 100644 init.lua create mode 100644 locale/ptol.es.tr create mode 100644 mod.conf create mode 100644 ptol.conf create mode 100644 sounds/ptol_warning.ogg create mode 100644 textures/ptol_blank.png diff --git a/.luacheckrc b/.luacheckrc new file mode 100644 index 0000000..50e8a9f --- /dev/null +++ b/.luacheckrc @@ -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", +} diff --git a/LICENSE.MD b/LICENSE.MD new file mode 100644 index 0000000..97ef811 --- /dev/null +++ b/LICENSE.MD @@ -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. + diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..3618f46 --- /dev/null +++ b/init.lua @@ -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 (x−cx)2+(y−cy)2+(z−cz)2= 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, +}) diff --git a/locale/ptol.es.tr b/locale/ptol.es.tr new file mode 100644 index 0000000..69d99fa --- /dev/null +++ b/locale/ptol.es.tr @@ -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. diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..9ff796d --- /dev/null +++ b/mod.conf @@ -0,0 +1 @@ +name = ptol diff --git a/ptol.conf b/ptol.conf new file mode 100644 index 0000000..1ae2b6a --- /dev/null +++ b/ptol.conf @@ -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 + diff --git a/sounds/ptol_warning.ogg b/sounds/ptol_warning.ogg new file mode 100644 index 0000000000000000000000000000000000000000..88bed9888932e489b35f5e9a8218f95d15e008c3 GIT binary patch literal 23715 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 W&|Q1Smay|6B54Kb4Ts`~0{#bmU>O_$ literal 0 HcmV?d00001 diff --git a/textures/ptol_blank.png b/textures/ptol_blank.png new file mode 100644 index 0000000000000000000000000000000000000000..08d5a3543b1dee4a7e90bbd98bf1921d3717fab7 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}blwj^(N7lvyfDCxxi6ez-3;1OBO zz@VoL!i*J5?aP3I>?NMQuIx|Q