diff --git a/worldmods/db/init.lua b/worldmods/db/init.lua new file mode 100644 index 0000000..788945e --- /dev/null +++ b/worldmods/db/init.lua @@ -0,0 +1,113 @@ +--This is a Libary for minetest mods +--author: addi +--for doku see : https://project.king-arthur.eu/projects/db/wiki +--license: LGPL v3 +local modpath= minetest.get_modpath("db"); +dofile(modpath.."/playerDB.lua") +DB = {} +DB.__index = DB +setmetatable(DB, { + __call = function (cls, ...) + return cls.new(...) + end, +}) +function DB.new(strategies) + local self = setmetatable({}, DB) + if strategies == nil then + print("WARNING: strategies is nil, so the database is only temporary aviable, and will deleted after shutdown") + end + self.strategies = strategies or {} + if self.strategies.fs then + print("safing database to filesystem") + local dir =""; + if self.strategies.fs.place == "world" then dir = minetest.get_worldpath() else dir = self.strategies.fs.place end + self.file = dir.."/"..self.strategies.fs.name.."."..self.strategies.fs.form + end + if self.strategies.mysql then + print("using existing mysql Table is currently not ready") + end + + + + self.storage = {}; + self:load() + print("new instance of DB created") + return self +end + +function DB:save() + if self.strategies.fs then + local output = io.open(self.file,'w') + if self.strategies.fs.form == "json" then + output:write(minetest.write_json(self.storage,true)); + elseif self.strategies.fs.form == "minetest" then + output:write(minetest.serialize(self.storage)); + end + io.close(output) + end + if self.strategies.mysql then + print("mysql is not ready currently") + end +end + +function DB:load() +if self.strategies.fs then + print("loading DB from file"..self.file) + local input = io.open(self.file, "r") + local data = nil + if input then + data = input:read('*all') + end + if data and data ~= "" then + if self.strategies.fs.form == "json" then + local json = minetest.parse_json(data); + self.storage = json or {} + elseif self.strategies.fs.form == "minetest" then + local serialize = minetest.deserialize(data); + self.storage = serialize or {} + end + io.close(input) + end +end +if self.strategies.mysql then + print("mysql is not ready currently") +end +end + +function DB:set(key,value) + assert(type(key) == "string","param 1 key must be a string!"); + assert(type(value) == "string" or type(value) == "number" or type(value) == "table" or type(value) == "boolean","param 2 default must be a string, number, table or a boolean value. Userdata,functions or nil is not alowed!") + + self.storage[key]=value; + self:save(); + return true; +end + + +function DB:get(player,key,default) + assert(type(key) == "string","param 1 key have to be a string!"); + assert(type(default) == "string" or type(default) == "number" or type(default) == "table" or type(default) == "boolean","param 2 default must be a string, number, table or a boolean value. Userdata,functions or nil is not alowed!") + + if self.storage[player] and self.storage[player][key] then + return self.storage[player][key] + end + + print("nothing found, returning default") + return default +end + +function DB:getAll(default) + assert(type(player) == "string" or player:is_player(),"param 1 player must be the playername or a player object!"); + assert(type(default) == "string" or type(default) == "number" or type(default) == "table" or type(default) == "boolean","param 3 default must be a string, number, table or a boolean value. Userdata,functions or nil is not alowed!") + if type(player) ~= "string" then + player = player:get_player_name(); + end + + if self.storage[player] then + return self.storage[player] + end + + print("nothing found, returning default") + return default +end +------------------------------------------------------- diff --git a/worldmods/db/playerDB.lua b/worldmods/db/playerDB.lua new file mode 100644 index 0000000..966f639 --- /dev/null +++ b/worldmods/db/playerDB.lua @@ -0,0 +1,137 @@ + +playerDB = {} +playerDB.__index = playerDB +setmetatable(playerDB, { + __call = function (cls, ...) + return cls.new(...) + end, +}) +function playerDB.new(strategies) + local self = setmetatable({}, playerDB) + if strategies == nil then + print("WARNING: strategies is nil, so the database is only temporary aviable, and will deleted after shutdown") + end + self.strategies = strategies or {} + if self.strategies.fs then + print("safing database to filesystem") + local dir =""; + if self.strategies.fs.place == "world" then dir = minetest.get_worldpath() else dir = self.strategies.fs.place end + self.file = dir.."/"..self.strategies.fs.name.."."..self.strategies.fs.form + end + if self.strategies.mysql then + print("using existing mysql Table is currently not ready") + end + + + + self.storage = {}; + self:load() + print("new instance of playerDB created") + return self +end + +function playerDB:save() + if self.strategies.fs then + local output = io.open(self.file,'w') + if self.strategies.fs.form == "json" then + output:write(minetest.write_json(self.storage,true)); + elseif self.strategies.fs.form == "minetest" then + output:write(minetest.serialize(self.storage)); + end + io.close(output) + end + if self.strategies.mysql then + print("mysql is not ready currently") + end +end + +function playerDB:load() +if self.strategies.fs then + print("loading playerDB from file"..self.file) + local input = io.open(self.file, "r") + local data = nil + if input then + data = input:read('*all') + end + if data and data ~= "" then + if self.strategies.fs.form == "json" then + local json = minetest.parse_json(data); + self.storage = json or {} + elseif self.strategies.fs.form == "minetest" then + local serialize = minetest.deserialize(data); + self.storage = serialize or {} + end + io.close(input) + end +end +if self.strategies.mysql then + print("mysql is not ready currently") +end +end + +function playerDB:set(player,key,value) +print("db:set wurde aufgerufen") + assert(type(player) == "string" or player:is_player(),"param 1 player must be the playername or a player object!"); + assert(type(key) == "string","param 2 key must be a string!"); + assert(type(value) == "string" or type(value) == "number" or type(value) == "table" or type(value) == "boolean","param 3 default must be a string, number, table or a boolean value. Userdata,functions or nil is not alowed!") + if type(player) ~= "string" then + player = player:get_player_name(); + end + if not self.storage[player] then + self.storage[player] = {}; + end + self.storage[player][key]=value; + self:save(); + return true; +end +function playerDB:del(player,key) +print("db:del wurde aufgerufen") +print(dump(key)) + assert(type(player) == "string" or player:is_player(),"param 1 player must be the playername or a player object!"); + assert(type(key) == "string","param 2 key must be a string!"); + if type(player) ~= "string" then + player = player:get_player_name(); + end + if not self.storage[player] then + self.storage[player] = {}; + end + self.storage[player][key]=nil; + print("db:wurde geloescht") + self:save(); + return true; +end + +function playerDB:get(player,key,default) + +--print("db:get wurde aufgerufen") + assert(type(player) == "string" or player:is_player(),"param 1 player must be the playername or a player object!"); + assert(type(key) == "string","param 2 key have to be a string!"); + assert(type(default) == "string" or type(default) == "number" or type(default) == "table" or type(default) == "boolean","param 3 default must be a string, number, table or a boolean value. Userdata,functions or nil is not alowed!") + if type(player) ~= "string" then + player = player:get_player_name(); + end + + if self.storage[player] and self.storage[player][key] then + return self.storage[player][key] + end + + print("nothing found, returning default") + return default +end + +function playerDB:getAll(player,default) + +--print("db:get wurde aufgerufen") + assert(type(player) == "string" or player:is_player(),"param 1 player must be the playername or a player object!"); + assert(type(default) == "string" or type(default) == "number" or type(default) == "table" or type(default) == "boolean","param 3 default must be a string, number, table or a boolean value. Userdata,functions or nil is not alowed!") + if type(player) ~= "string" then + player = player:get_player_name(); + end + + if self.storage[player] then + return self.storage[player] + end + + print("nothing found, returning default") + return default +end \ No newline at end of file diff --git a/worldmods/teleporter/README.md b/worldmods/teleporter/README.md new file mode 100644 index 0000000..3678795 --- /dev/null +++ b/worldmods/teleporter/README.md @@ -0,0 +1,87 @@ +# MINETEST MOD teleporter # +----------------------------------------------------------------- + +This mod makes it possible for players to teleport to other (known) destinations. + +## How it Works: ## +This mod adds 2 new blocks (nodes) to the game. These are a teleporter and a receiver. + +A teleporter teleports players, or items to the choose receiver +a teleporter must be linked to a receiver first, before you can use it. +One teleporter can only link to one receiver, you have to unlink it first, before using a new receiver. +a receiver can accessed by many teleporters. + + +### Part 1: the receiver ### +Craft the receiver using; + +``` +copper ingot - steel ingot - copper ingot +steel ingot - steel ingot - steel ingot +``` + +![craft_receiver.png](https://bitbucket.org/repo/anzb59/images/685871294-craft_receiver.png) + +Or use the chat command `/giveme teleporter:receiver`. + +Place the receiver at this destination where you want to teleport to. +You now have to enter a name and a short description + +You are maybe allowed to make the receiver public. (read mor at public receiver) +If you want, you can mark this receiver as favorite (that receivers will marked with a ![teleporter_bookmark.png](https://bitbucket.org/repo/anzb59/images/4022584398-teleporter_bookmark.png) in the list) + +### Part 2: the teleporter ### +Craft the teleporter using; + +``` +copper ingot - glass - copper ingot +steel ingot - mese block - copper ingot +steel ingot - steel ingot - steel ingot +``` +![craft_teleporter.png](https://bitbucket.org/repo/anzb59/images/2855559446-craft_teleporter.png) + +Or use the chat command `/giveme teleporter:teleporter`. + +After you placed the teleporter all known receivers will apear in the list. +just choose one and click `OKAY`. +![setup_teleporter.png](https://bitbucket.org/repo/anzb59/images/1861039821-setup_teleporter.png) +If you are playing on a server there are maybe some public receivers, you can list it by checking `show the public receivers list`. +public receivers can be set by other players, or by server admin, there are maybe some intresting destinations. +---------------------- + +## Download and installation ## +make shure you have the [db](https://forum.minetest.net/viewtopic.php?f=11&t=9276) mod installed. +you can get it [here](https://bitbucket.org/adrido/db/downloads). + + +1. visit [the download page](https://bitbucket.org/kingarthursteam/teleporter/downloads) +2. download the zip file or the zip file, that comes with db mod. +3. extract its content to `minetest/mods/` +4. rename the folder to just `teleporter` +5. start minetest, select the world where you want to use it, and click `configure` +6. select teleporter from the list and click `enabled` + +If this does not work, have a look into the [official Minetest Wiki](http://dev.minetest.net/Installing_Mods) how to install mods. + +---------------------- + +## Bug reports/ Feature requests ## +just create a new ticket, or post your question in the minetest forum. +todo: place link here +---------------------- + +## License ## +![CC BY License](https://i.creativecommons.org/l/by/4.0/88x31.png) +This work is licensed under a [Creative Commons Attribution 4.0 International License](http://creativecommons.org/licenses/by/4.0/). +---------------------- + +## About: public receivers ## +A public receiver is a receiver which is marked as public by the server admin. +They appear in the public receiver list, and every player is allowed to link a teleporter to it. + +## About: the runes ## +The runes on the receiver and teleporter are not magic,or evil they are just `Futhark` (ᚠᚢᚦᚪᚱᛣ) +Futhark derived from their first six letters of the alphabet: ᚠ, ᚢ, Þ, ᚦ, ᚱ, and ᛣ. +Futhark is one of the oldest alphabet used in German and England (3rd Century) +if you are interested, you can look on Wikipedia: +http://en.wikipedia.org/wiki/Elder_Futhark and http://en.wikipedia.org/wiki/Runes \ No newline at end of file diff --git a/worldmods/teleporter/depends.txt b/worldmods/teleporter/depends.txt new file mode 100644 index 0000000..d77d11b --- /dev/null +++ b/worldmods/teleporter/depends.txt @@ -0,0 +1,2 @@ +default +db diff --git a/worldmods/teleporter/functions.lua b/worldmods/teleporter/functions.lua new file mode 100644 index 0000000..172d447 --- /dev/null +++ b/worldmods/teleporter/functions.lua @@ -0,0 +1,277 @@ + +function teleporter.getList(name) +local receivers = teleporter.getReceiversObj(name); +local list = ""; +local keys = {}; + for i, v in ipairs(teleporter.getReceiversArr(name)) do + local receiver = receivers[v]; + if receiver.fav == nil then + receiver.fav = 0; + end + if receiver.pub == nil then + receiver.pub = 0; + end + keys[#keys+1] = receiver.fav..","..receiver.pub..","..minetest.formspec_escape(v)..","..minetest.formspec_escape(receiver.name)..","..minetest.formspec_escape(receiver.desc); + end + + list = table.concat(keys,","); + +return list; +end + +function teleporter.getReceiversObj(name) + return storage:getAll(name,{}); +end + +function teleporter.getReceiversArr(name) + return generate_key_list(storage:getAll(name,{})); +end + +function teleporter.getreceiverForm(pos) + local meta = minetest.get_meta(pos); + local public = meta:get_string("public"); + local fav = meta:get_string("favorite"); + local form = "size[8,5;]".. + "label[0.1,0.0;Receiver Settings]".. + "box[0.1,0.6;3,0.05;#FFFFFF]".. + "checkbox[0.1,0.6;public;add this receiver to the public list (server-admins only);"..public.."]".. + "checkbox[0.1,1;favorite;mark this receiver as favorite;"..fav.."]".. + "field[0.3,2.5;4,1;name;Name of this Destination:;${name}]".. + "field[0.3,3.5;8,1;desc;a short Description:;${desc}]".. + "button_exit[4.1,4.4;4,1;save;OKAY]".. + "button_exit[0.1,4.4;4,1;exit;Abort]".. + default.gui_slots; + return form +end + +function teleporter.receiver_placed(itemstack, placer, pointed_thing) + local pos = pointed_thing.above; + --print("receiver placed at ".. minetest.pos_to_string(pos)); + minetest.rotate_node(itemstack, placer, pointed_thing) + local meta = minetest.get_meta(pos); + -- Get placer's name. + local name = placer:get_player_name(); + + + meta:set_string("formspec",teleporter.getreceiverForm(pos)); + meta:set_string("infotext", "NOT READY! \nRight-click to initialize!"); + meta:set_string("owner", name); + return itemstack; +end + +function teleporter.receiver_receive_fields(pos, formname, fields, sender) + local meta = minetest.get_meta(pos); + if teleporter.can_access(pos,sender) then + --print("Receiver submit: "..dump(fields)); + if fields.save and fields.name then + + meta:set_string("name",fields.name); + meta:set_string("desc",fields.desc); + meta:set_string("infotext","Receiver: "..fields.name.."\n"..fields.desc) + teleporter.change_dest(meta:get_string("owner"),pos,fields.name,fields.desc); + local node = minetest.get_node(pos); + node.name = "teleporter:receiver_active"; + minetest.swap_node(pos,node);--zu guter letzt den Receiver anschalten + if meta:get_string("public") == "true" then + teleporter.change_dest("public",pos,fields.name,fields.desc); + else + storage:del("public",minetest.pos_to_string(pos)); + end + elseif fields.public then + local privs = minetest.get_player_privs(sender:get_player_name()) + if privs["server"] then + meta:set_string("public",fields.public); + meta:set_string("formspec",teleporter.getreceiverForm(pos)); + + else + minetest.chat_send_player(sender:get_player_name(),"Teleporter -!-: you cannot add/remove this receiver to/from the public list. only the server admins are alowed to do it!") + end + elseif fields.favorite then + meta:set_string("favorite",fields.favorite); + meta:set_string("formspec",teleporter.getreceiverForm(pos)); + + end + + + else + minetest.chat_send_player(sender:get_player_name(),"Teleporter -!-: you cannot change the settings, only "..meta:get_string("owner").." or the server admins are alowed to do it!") + end +end + +function teleporter.receiver_removed(pos) + local meta= minetest.get_meta(pos); + local owner = meta:get_string("owner"); + local public = meta:get_string("public"); + if owner ~= "" then + --print("try to del teleporter of "..dump(owner).." at "..dump(pos)) + storage:del(owner,minetest.pos_to_string(pos)); + end + if public == "true" then + --print("try to del public teleporter of "..dump(owner).."at "..dump(pos)) + storage:del("public",minetest.pos_to_string(pos)); + end +end + +function teleporter.change_dest(player,pos,name,desc) + local meta = minetest.get_meta(pos); + local public = meta:get_string("public") + local fav = meta:get_string("favorite"); + if fav == "true" then + fav = 1; + else + fav = 0; + end + if public == "true" then + public = 1; + else + public = 0; + end + local data = {}; + data.fav = fav; + data.pub = public; + data.name = name; + data.desc = desc; + data.dest = minetest.pos_to_string(pos); + storage:set(player,minetest.pos_to_string(pos),data);--yay thats all :-) + end +teleporter.types = {"public","private"}; + +function teleporter.getform(pos) + local meta = minetest.get_meta(pos); + local item = meta:get_int("item"); + local mode = meta:get_int("mode") or 0; + local name = meta:get_string("owner"); + local public = meta:get_string("public") + local form = ""; + if mode == 0 or mode == nil then --mode 0 means choose a receiver from the list + local list = ""; + if public == "true" then + list=teleporter.getList("public"); + else + list = teleporter.getList(name); + end + if list == "" then + list = "1,1,____pos____,_____Name_____,_____Description_____" + else + list = "1,1,____pos____,_____Name_____,_____Description_____,"..list + end + form = "size[10,7;]".. + "label[0.1,0.0;Chose a Receiver from the list:]".. + "box[0.1,0.6;6,0.05;#FFFFFF]".. + "checkbox[0.1,0.6;public;show the Public Receiver list;"..public.."]".. + "label[0.1,1.3;Known Receivers: ]".. + "tablecolumns[image,tooltip=favorite,1=teleporter_bookmark.png;image,tooltip=public receiver,1=teleporter_world.png;text,tooltip=Coordinates,align=right;text,tooltip=Name;text,tooltip=Description]".. + "table[0.1,1.7;9.7,4.5;dest;"..list..";"..item.."]".. + "button[0.1,6.2;5.7,1;reload;reload list]".. + "button[6.0,6.2;4.0,1;save_dest;OKAY]"; + else --mode 1 means the teleporter has a destination, an can be used + form = "size[9,6;]".. + "label[0.1,0.0;Teleporter Settings]".. + "box[0.1,0.6;3,0.05;#FFFFFF]".. + "label[0.1,1;Owner: "..meta:get_string("owner").."]".. + "label[0.1,1.3;Uses Public Receiver: "..public.."]".. + "label[0.1,2;Destination: "..meta:get_string("coords").."]".. + "label[0.1,2.3;Name: "..meta:get_string("name").."]".. + "label[0.1,2.6;Description: "..meta:get_string("desc").."]".. + "button[0.1,5;5.7,1;unlink;Unlink destination and choose a new one]".. + "button_exit[6.0,5;3.0,1;save;OKAY]"; + end + return form +end + +function teleporter.placed(itemstack, placer, pointed_thing) + local pos = pointed_thing.above; + minetest.rotate_node(itemstack, placer, pointed_thing) + local meta = minetest.get_meta(pos) + local name = placer:get_player_name(); + meta:set_int("item",1);--the default + meta:set_int("type",1); + meta:set_string("owner", name); + meta:set_string("infotext","Teleporter offline"); + meta:set_string("formspec",teleporter.getform(pos,name)); + return itemstack; +end + + + + + + + +--alias teleporter:teleporter_pad to teleporter:teleporter + +function teleporter.received_fields(pos, formname, fields, sender) + local meta = minetest.get_meta(pos); + local name = meta:get_string("owner"); + if teleporter.can_access(pos,sender) then + print(dump(fields)); + + + + --print("Player "..sender:get_player_name().." submitted fields "..dump(fields)); + if fields.reload then + meta:set_string("formspec",teleporter.getform(pos)); + meta:set_int("item",1); + elseif fields.unlink then + meta:set_int("mode",0); + meta:set_int("item",0); + meta:set_string("formspec",teleporter.getform(pos)); + meta:set_string("infotext","Teleporter offline");--den infotext setzen + local node = minetest.get_node(pos); + node.name = "teleporter:teleporter"; + minetest.swap_node(pos,node);--zu guter letzt den Teleporter ausshalten. + elseif fields.dest then + local event = minetest.explode_table_event(fields.dest); + if meta:get_string("public") == "true" then + name = "public" + end + --print("wurde gesplitted",dump(event)); + meta:set_int("item",event.row); + meta:set_string("coords",teleporter.getReceiversArr(name)[event.row-1]);--vom event index nochmal eins abziehen, weil ja der erste eintrag none ist. + --print("Receivers list:"..dump(teleporter.getReceiversArr(name))); + meta:set_string("formspec",teleporter.getform(pos));--no need for recreate formspec + + + elseif fields.save_dest then --ok jetzt muss alles ueber den gewahlten Receiver gespeichert werden + local coords = meta:get_string("coords"); + --print("save_dest"); + if coords == "" then --wenn keine coords festgelegt sind + --meta:set_string("formspec",teleporter.getform(pos)); + meta:set_string("infotext","Teleporter offline");--den infotext setzen + minetest.swap_node(pos,{name="teleporter:teleporter"});--zu guter letzt den Teleporter ausshalten. + else + if meta:get_string("public") == "true" then + name = "public"; --work temprarly with "public" as name + end + local receiver = storage:get(name,coords,{name="none",desc="No Receiver selected."}); + --print("Receiver: "..dump(receiver),"coords:"..dump(coords),"player:"..dump(name)); + meta:set_int("mode",1);--modus auf 1 setzen + meta:set_string("name",receiver.name); + meta:set_string("desc",receiver.name); + meta:set_string("formspec",teleporter.getform(pos));--formular neu generieren + meta:set_string("infotext","Teleport to "..receiver.name.."\n"..receiver.desc);--den infotext setzen + local node = minetest.get_node(pos); + node.name = "teleporter:teleporter_active"; + minetest.swap_node(pos,node);--zu guter letzt den Teleporter aktivschalten. + end + elseif fields.public then + meta:set_int("item",0); + meta:set_string("public",fields.public); + meta:set_string("formspec",teleporter.getform(pos)); + end + else + minetest.chat_send_player(sender:get_player_name(),"Teleporter -!-: you cannot change the settings, only "..name.." or the server admins are alowed to do it!") + end +end + + +teleporter.can_access = function(pos,player) + local meta = minetest.env:get_meta(pos) + local name = player:get_player_name() + local privs = minetest.get_player_privs(name) + if name == meta:get_string("owner") or privs["server"] then + return true + end + return false +end + \ No newline at end of file diff --git a/worldmods/teleporter/init.lua b/worldmods/teleporter/init.lua new file mode 100644 index 0000000..55cc25a --- /dev/null +++ b/worldmods/teleporter/init.lua @@ -0,0 +1,70 @@ + function generate_key_list(t) + local keys = {} + for k, v in pairs(t) do + keys[#keys+1] = k + end + return keys + end + +local strategies = { +fs={name ="teleporters" ,form="json", place="world"}, +} +storage = playerDB(strategies) + + +teleporter = {} +teleporter.version = 2.6 +teleporter.active_light = 3; +teleporter.groups = {oddly_breakable_by_hand=2}; +teleporter.groups2 = {oddly_breakable_by_hand=2,not_in_creative_inventory=1,} + +-- config.lua contains configuration parameters +--dofile(minetest.get_modpath("teleporter").."/config.lua") +dofile(minetest.get_modpath("teleporter").."/functions.lua") +dofile(minetest.get_modpath("teleporter").."/nodes.lua") + + + + + + +minetest.register_abm( + {nodenames = {"teleporter:teleporter_active"}, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local objs = minetest.env:get_objects_inside_radius(pos, 1) + local meta = minetest.get_meta(pos); + local owner = meta:get_string("owner"); + if meta:get_string("public") == "true" then --if the receiver is public change the owner to public + owner = "public"; + end + + local dest = meta:get_string("coords"); + for k, obj in pairs(objs) do + + if storage:get(owner,dest,false) then --if the receiver is aviable + + local topos = minetest.string_to_pos(dest); + --minetest.sound_play("teleporter_teleport", {pos = pos, gain = 1.0, max_hear_distance = 2,}) + obj:setpos({x=topos.x,y=topos.y-0.5,z=topos.z}) + minetest.sound_play("teleporter_teleport", {pos = topos, gain = 1.0, max_hear_distance = 2,}) + + else + + local err = "Error 404: no receiver pad at "..dest.." found. maybe its dug?\n".. + "If you are shure there is a receiver, ask a server admin, you may found a bug!" + meta:set_string("infotext", err); + minetest.swap_node(pos,{name="teleporter:teleporter"}); + + meta:set_string("formspec",teleporter.getform(pos,owner)); + if obj:is_player() then + minetest.chat_send_player(obj:get_player_name(),err); + + minetest.sound_play("no_service", {pos = pos, gain = 0.5, max_hear_distance = 2,}) + end + end + end + end +}) + diff --git a/worldmods/teleporter/license.txt b/worldmods/teleporter/license.txt new file mode 100644 index 0000000..4362b49 --- /dev/null +++ b/worldmods/teleporter/license.txt @@ -0,0 +1,502 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/worldmods/teleporter/nodes.lua b/worldmods/teleporter/nodes.lua new file mode 100644 index 0000000..768c481 --- /dev/null +++ b/worldmods/teleporter/nodes.lua @@ -0,0 +1,135 @@ +--[[ +minetest.register_craft({ + output = 'teleporter:teleporter_pad', + recipe = { + {'moreores:copper_ingot', 'default:glass', 'moreores:copper_ingot'}, + {'moreores:copper_ingot', 'moreores:gold_block', 'moreores:copper_ingot'}, + {'moreores:copper_ingot', 'mesecons_powerplant:power_plant', 'moreores:copper_ingot'}, + } +}) +]] + +minetest.register_craft({ + output = 'teleporter:teleporter', + recipe = { + {'default:copper_ingot', 'default:glass', 'default:copper_ingot'}, + {'default:steel_ingot', 'default:mese', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:gold_ingot', 'default:steel_ingot'}, + } +}) + +minetest.register_craft({ + output = 'teleporter:receiver', + recipe = { + {'', '', ''}, + {'default:copper_ingot', 'default:steel_ingot', 'default:copper_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + } +}) + +--TELEPORTER + +minetest.register_node("teleporter:teleporter", { + description = "Teleporter Pad", + tiles = { + "teleporter.png", + "default_stone.png" + + }, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + groups = teleporter.groups, + node_box = { + type = "fixed", + fixed = { + { -0.5, -0.4375, -0.5, 0.5, -0.5, 0.5 }, + }, + }, + sounds = default.node_sound_stone_defaults(), + + on_place = teleporter.placed, + + on_receive_fields = teleporter.received_fields, + + can_dig = teleporter.can_access +}) + +minetest.register_node("teleporter:teleporter_active", { + description = "Teleporter Pad (cheater!)", + tiles = { + "teleporter_active.png", + "default_stone.png" + + }, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + light_source = teleporter.active_light, + groups = teleporter.groups2, + node_box = { + type = "fixed", + fixed = { + { -0.5, -0.4375, -0.5, 0.5, -0.5, 0.5 }, + }, + }, + drop = "teleporter:teleporter", + sounds = default.node_sound_stone_defaults(), + + + + on_receive_fields = teleporter.received_fields, + + can_dig = teleporter.can_access +}) + +--RECEIVER + +minetest.register_node("teleporter:receiver", { + description = "Receiver Pad", + tiles = { + "teleporter_receiver.png", + "default_stone.png" + }, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + groups = teleporter.groups, + node_box = { + type = "fixed", + fixed = { + { -0.5, -0.4375, -0.5, 0.5, -0.5, 0.5 }, + }, + }, + sounds = default.node_sound_stone_defaults(), + on_place = teleporter.receiver_placed, --minetest.rotate_node, --used to rotate the node does not work correctly! + --after_place_node = , --used to set metadata + on_receive_fields = teleporter.receiver_receive_fields, + can_dig = teleporter.can_access, + on_destruct = teleporter.receiver_removed, +}) + +minetest.register_node("teleporter:receiver_active", { + description = "Receiver Pad (cheater!)", + tiles = { + "teleporter_receiver_active.png", + "default_stone.png" + }, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + light_source = teleporter.active_light, + groups = teleporter.groups2, + drop = "teleporter:receiver", + node_box = { + type = "fixed", + fixed = { + { -0.5, -0.4375, -0.5, 0.5, -0.5, 0.5 }, + }, + }, + sounds = default.node_sound_stone_defaults(), + after_place_node = teleporter.receiver_placed, + on_receive_fields = teleporter.receiver_receive_fields, + can_dig = teleporter.can_access, + on_destruct = teleporter.receiver_removed, +}) diff --git a/worldmods/teleporter/sounds/no_service.ogg b/worldmods/teleporter/sounds/no_service.ogg new file mode 100644 index 0000000..91fd455 Binary files /dev/null and b/worldmods/teleporter/sounds/no_service.ogg differ diff --git a/worldmods/teleporter/sounds/teleporter_teleport.ogg b/worldmods/teleporter/sounds/teleporter_teleport.ogg new file mode 100644 index 0000000..6b73b96 Binary files /dev/null and b/worldmods/teleporter/sounds/teleporter_teleport.ogg differ diff --git a/worldmods/teleporter/textures/license.txt b/worldmods/teleporter/textures/license.txt new file mode 100644 index 0000000..f2a6dbe --- /dev/null +++ b/worldmods/teleporter/textures/license.txt @@ -0,0 +1,4 @@ +2 images taken from the open icon libary: + +teleporter_world.png / famfamfam-silk / CC-BY-2.5 or CC-BY-3.0 +teleporter_bookmark.png / intrigue / GPLv2 diff --git a/worldmods/teleporter/textures/teleporter.png b/worldmods/teleporter/textures/teleporter.png new file mode 100644 index 0000000..3f83c22 Binary files /dev/null and b/worldmods/teleporter/textures/teleporter.png differ diff --git a/worldmods/teleporter/textures/teleporter_active.png b/worldmods/teleporter/textures/teleporter_active.png new file mode 100644 index 0000000..a94365a Binary files /dev/null and b/worldmods/teleporter/textures/teleporter_active.png differ diff --git a/worldmods/teleporter/textures/teleporter_bookmark.png b/worldmods/teleporter/textures/teleporter_bookmark.png new file mode 100644 index 0000000..449b821 Binary files /dev/null and b/worldmods/teleporter/textures/teleporter_bookmark.png differ diff --git a/worldmods/teleporter/textures/teleporter_receiver.png b/worldmods/teleporter/textures/teleporter_receiver.png new file mode 100644 index 0000000..85f9c4c Binary files /dev/null and b/worldmods/teleporter/textures/teleporter_receiver.png differ diff --git a/worldmods/teleporter/textures/teleporter_receiver_active.png b/worldmods/teleporter/textures/teleporter_receiver_active.png new file mode 100644 index 0000000..5fa190f Binary files /dev/null and b/worldmods/teleporter/textures/teleporter_receiver_active.png differ diff --git a/worldmods/teleporter/textures/teleporter_world.png b/worldmods/teleporter/textures/teleporter_world.png new file mode 100644 index 0000000..efb7544 Binary files /dev/null and b/worldmods/teleporter/textures/teleporter_world.png differ diff --git a/worldmods/teleporter/textures/textures.zip b/worldmods/teleporter/textures/textures.zip new file mode 100644 index 0000000..d1288e4 Binary files /dev/null and b/worldmods/teleporter/textures/textures.zip differ diff --git a/worldmods/teleporter/textures/textures256.zip b/worldmods/teleporter/textures/textures256.zip new file mode 100644 index 0000000..29bd286 Binary files /dev/null and b/worldmods/teleporter/textures/textures256.zip differ