mirror of
https://codeberg.org/tenplus1/teleport_potion.git
synced 2025-03-15 06:01:24 +00:00
First Commit by TenPlus1
This commit is contained in:
commit
e1e80c56dc
9 changed files with 252 additions and 0 deletions
1
depends.txt
Normal file
1
depends.txt
Normal file
|
@ -0,0 +1 @@
|
|||
default
|
237
init.lua
Executable file
237
init.lua
Executable file
|
@ -0,0 +1,237 @@
|
|||
|
||||
--= Teleport Potion mod 0.3 by TenPlus1
|
||||
|
||||
--= Create potion/pad, right-click to enter coords and walk into the blue light,
|
||||
--= Portal closes after 10 seconds, pad remains... SFX are license Free...
|
||||
|
||||
teleport = {}
|
||||
|
||||
-- Teleport Portal recipe
|
||||
minetest.register_craft({
|
||||
output = 'teleport_potion:potion',
|
||||
recipe = {
|
||||
{'vessels:glass_bottle', 'default:diamondblock', ''}
|
||||
}
|
||||
})
|
||||
|
||||
-- Teleport Pad recipe
|
||||
minetest.register_craft({
|
||||
output = 'teleport_potion:pad',
|
||||
recipe = {
|
||||
{"teleport_potion:potion", 'default:glass', "teleport_potion:potion"},
|
||||
{"default:glass", "default:mese", "default:glass"},
|
||||
{"teleport_potion:potion", "default:glass", "teleport_potion:potion"}
|
||||
}
|
||||
})
|
||||
-- Default coords
|
||||
teleport.default = {x=0, y=0, z=0}
|
||||
|
||||
-- Portal
|
||||
minetest.register_node("teleport_potion:portal", {
|
||||
drawtype = "plantlike",
|
||||
tiles = {{name="portal.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=1.0}},},
|
||||
light_source = 12,
|
||||
walkable = false,
|
||||
pointable = false,
|
||||
buildable_to = true,
|
||||
waving = 1,
|
||||
sunlight_propagates = true,
|
||||
damage_per_second = 1, -- Walking into portal also hurts player
|
||||
|
||||
-- Start timer when portal appears
|
||||
on_construct = function(pos)
|
||||
minetest.env:get_node_timer(pos):start(10)
|
||||
end,
|
||||
|
||||
-- Remove portal after 10 seconds
|
||||
on_timer = function(pos)
|
||||
minetest.sound_play("portal_close", {pos = pos, gain = 1.0, max_hear_distance = 10,})
|
||||
minetest.env:set_node(pos, {name="air"})
|
||||
end,
|
||||
})
|
||||
|
||||
-- Potion
|
||||
minetest.register_node("teleport_potion:potion", {
|
||||
tile_images = {"pad.png"},
|
||||
drawtype = "signlike",
|
||||
paramtype = "light",
|
||||
paramtype2 = "wallmounted",
|
||||
walkable = false,
|
||||
sunlight_propagates = true,
|
||||
description="Teleport Potion (place and right-click to enchant location)",
|
||||
inventory_image = "potion.png",
|
||||
wield_image = "potion.png",
|
||||
metadata_name = "sign",
|
||||
groups = {snappy=3, dig_immediate=3},
|
||||
selection_box = {type = "wallmounted",},
|
||||
|
||||
on_construct = function(pos)
|
||||
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
|
||||
-- Text entry formspec
|
||||
meta:set_string("formspec", "field[text;;${text}]")
|
||||
meta:set_string("infotext", "Enter teleport coords (e.g 200,20,-200)")
|
||||
meta:set_string("text", teleport.default.x..","..teleport.default.y..","..teleport.default.z)
|
||||
|
||||
-- Load with default coords
|
||||
meta:set_float("enabled", -1)
|
||||
meta:set_float("x", teleport.default.x)
|
||||
meta:set_float("y", teleport.default.y)
|
||||
meta:set_float("z", teleport.default.z)
|
||||
end,
|
||||
|
||||
-- Right-click to enter new coords
|
||||
on_right_click = function(pos, placer)
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
end,
|
||||
|
||||
-- Once entered, check coords and teleport, otherwise return potion
|
||||
on_receive_fields = function(pos, formname, fields, sender)
|
||||
|
||||
local coords = teleport.coordinates(fields.text)
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
local name = sender:get_player_name()
|
||||
|
||||
if coords then
|
||||
|
||||
minetest.add_node(pos, {name="teleport_potion:portal"})
|
||||
|
||||
local newmeta = minetest.get_meta(pos)
|
||||
|
||||
newmeta:set_float("x", coords.x)
|
||||
newmeta:set_float("y", coords.y)
|
||||
newmeta:set_float("z", coords.z)
|
||||
newmeta:set_string("text", fields.text)
|
||||
|
||||
minetest.sound_play("portal_open", {pos = pos, gain = 1.0, max_hear_distance = 10,})
|
||||
|
||||
else
|
||||
minetest.chat_send_player(name, 'Potion failed!')
|
||||
minetest.env:set_node(pos, {name="air"})
|
||||
minetest.env:add_item(pos, 'teleport_potion:potion')
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
-- Pad
|
||||
minetest.register_node("teleport_potion:pad", {
|
||||
tile_images = {"padd.png"},
|
||||
drawtype = 'nodebox',
|
||||
paramtype = "light",
|
||||
paramtype2 = "wallmounted",
|
||||
walkable = true,
|
||||
sunlight_propagates = true,
|
||||
description="Teleport Pad (place and right-click to enchant location)",
|
||||
inventory_image = "padd.png",
|
||||
wield_image = "padd.png",
|
||||
metadata_name = "sign",
|
||||
light_source = 5,
|
||||
groups = {snappy=3, dig_immediate=3},
|
||||
node_box = {
|
||||
type = "wallmounted",
|
||||
wall_top = {-0.5, 0.4375, -0.5, 0.5, 0.5, 0.5},
|
||||
wall_bottom = {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5},
|
||||
wall_side = {-0.5, -0.5, -0.5, -0.4375, 0.5, 0.5},
|
||||
},
|
||||
selection_box = {type = "wallmounted"},
|
||||
|
||||
on_construct = function(pos)
|
||||
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
|
||||
-- Text entry formspec
|
||||
meta:set_string("formspec", "field[text;;${text}]")
|
||||
meta:set_string("infotext", "Enter teleport coords (e.g 200,20,-200)")
|
||||
meta:set_string("text", teleport.default.x..","..teleport.default.y..","..teleport.default.z)
|
||||
|
||||
-- Load with default coords
|
||||
meta:set_float("enabled", -1)
|
||||
meta:set_float("x", teleport.default.x)
|
||||
meta:set_float("y", teleport.default.y)
|
||||
meta:set_float("z", teleport.default.z)
|
||||
end,
|
||||
|
||||
-- Right-click to enter new coords
|
||||
on_right_click = function(pos, placer)
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
end,
|
||||
|
||||
-- Once entered, check coords and teleport, otherwise return potion
|
||||
on_receive_fields = function(pos, formname, fields, sender)
|
||||
|
||||
local coords = teleport.coordinates(fields.text)
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
local name = sender:get_player_name()
|
||||
|
||||
if minetest.is_protected(pos, name) then
|
||||
minetest.record_protection_violation(pos, name)
|
||||
return
|
||||
end
|
||||
|
||||
if coords then
|
||||
|
||||
local newmeta = minetest.get_meta(pos)
|
||||
|
||||
newmeta:set_float("x", coords.x)
|
||||
newmeta:set_float("y", coords.y)
|
||||
newmeta:set_float("z", coords.z)
|
||||
newmeta:set_string("text", fields.text)
|
||||
|
||||
meta:set_string("infotext", "Pad Active ("..coords.x..","..coords.y..","..coords.z..")")
|
||||
minetest.sound_play("portal_open", {pos = pos, gain = 1.0, max_hear_distance = 10,})
|
||||
|
||||
else
|
||||
minetest.chat_send_player(name, 'Teleport Pad Coordinates failed!')
|
||||
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
-- Check coords
|
||||
teleport.coordinates = function(str)
|
||||
|
||||
if not str or str == "" then return nil end
|
||||
|
||||
-- Get coords from string
|
||||
local x,y,z = string.match(str, "^(-?%d+),(-?%d+),(-?%d+)")
|
||||
|
||||
-- Check coords
|
||||
if x==nil or string.len(x) > 6
|
||||
or y==nil or string.len(y) > 6
|
||||
or z==nil or string.len(z) > 6 then
|
||||
return nil
|
||||
end
|
||||
|
||||
-- Convert string coords to numbers
|
||||
x = x + 0.0; y = y + 0.0; z = z + 0.0
|
||||
|
||||
-- Are coords in map range ?
|
||||
if x > 30900 or x < -30900
|
||||
or y > 30900 or y < -30900
|
||||
or z > 30900 or z < -30900 then
|
||||
return nil
|
||||
end
|
||||
|
||||
-- Return ok coords
|
||||
return {x=x, y=y, z=z}
|
||||
end
|
||||
|
||||
-- Has player walked inside portal
|
||||
minetest.register_abm({
|
||||
nodenames = {"teleport_potion:portal", "teleport_potion:pad"},
|
||||
interval = 1.0,
|
||||
chance = 1,
|
||||
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
local objs = minetest.env:get_objects_inside_radius(pos, 1)
|
||||
for k, player in pairs(objs) do
|
||||
if player:get_player_name() then
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
local target_coords={x=meta:get_float("x"), y=meta:get_float("y"), z=meta:get_float("z")}
|
||||
minetest.sound_play("portal_close", {pos = pos, gain = 1.0, max_hear_distance = 5,})
|
||||
player:moveto(target_coords, false)
|
||||
end
|
||||
end
|
||||
end
|
||||
})
|
14
license.txt
Normal file
14
license.txt
Normal file
|
@ -0,0 +1,14 @@
|
|||
|
||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
Version 2, December 2004
|
||||
|
||||
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim or modified
|
||||
copies of this license document, and changing it is allowed as long
|
||||
as the name is changed.
|
||||
|
||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. You just DO WHAT THE FUCK YOU WANT TO.
|
BIN
sounds/portal_close.ogg
Normal file
BIN
sounds/portal_close.ogg
Normal file
Binary file not shown.
BIN
sounds/portal_open.ogg
Normal file
BIN
sounds/portal_open.ogg
Normal file
Binary file not shown.
BIN
textures/pad.png
Normal file
BIN
textures/pad.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 334 B |
BIN
textures/padd.png
Normal file
BIN
textures/padd.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 225 B |
BIN
textures/portal.png
Normal file
BIN
textures/portal.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 458 B |
BIN
textures/potion.png
Normal file
BIN
textures/potion.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 161 B |
Loading…
Add table
Reference in a new issue