Last active
August 21, 2017 18:50
-
-
Save mkarneim/937afb517191e446008fb80a0abfbe14 to your computer and use it in GitHub Desktop.
Magical City Spells
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| -- Magical City Spells | |
| -- ( https://gist.github.com/mkarneim/937afb517191e446008fb80a0abfbe14 ) | |
| require "gist.835077aed5123947fe006e6d5ed5582b.books" | |
| -- https://gist.github.com/mkarneim/6cd6d5801b462fc85e63cd6c308b7f9f | |
| require "gist.6cd6d5801b462fc85e63cd6c308b7f9f.selection" | |
| -- https://gist.github.com/mkarneim/cfd15dc4a8a6d4c5bd471b62a36a126d | |
| require "gist.cfd15dc4a8a6d4c5bd471b62a36a126d.architect" | |
| -- https://gist.github.com/mkarneim/c94fa9589afadcd9ae345a599a0f31f8 | |
| require "gist.c94fa9589afadcd9ae345a599a0f31f8.MickKay-WoL" | |
| magicalCity = {} | |
| function magicalCity.startup() | |
| spell:say("Startup") | |
| spell:execute('setworldspawn 0 1 0') | |
| spell:execute('worldborder set 60000000') | |
| spell:execute('worldborder center 0 0') | |
| spell:execute('lua magicalCity.setSpawnpoint(-1465,63,-674)') | |
| spell:execute('lua magicalCity.provideBook()') | |
| spell:execute('lua magicalCity.setWelcome("Tippe BOOK in den Chat!")') | |
| spell:execute('lua magicalCity.handleArchitectTaggedEvent()') | |
| spell:execute('lua magicalCity.makeArchitectsCreative()') | |
| spell:execute('lua magicalCity.handlePlayerJoined()') | |
| spell:execute('lua architect.startup()') | |
| spell:execute('lua magicalCity.architectAura()') | |
| spell:execute('lua magicalCity.handleSonne()') | |
| spell:execute('lua magicalCity.mickkays_kamin()') | |
| spell:execute('lua magicalCity.restartArchitects()') | |
| spell:execute('lua mickkay.startup()') | |
| spell:say("Ready.") | |
| end | |
| function magicalCity.sun() | |
| spell:execute("time set day") | |
| spell:execute("weather clear") | |
| end | |
| function magicalCity.setSpawnpoint( x, y, z) | |
| spell:say("Setze Spawnpoint auf "..x..", "..y..", "..z) | |
| local eventqueue = Events.register("PlayerLoggedInEvent", "PlayerRespawnEvent") | |
| for event in eventqueue.next do | |
| local n = event.player.name | |
| if event.player.gamemode ~= "SPECTATOR" then | |
| spell:execute( "tp "..n.." "..x.." "..y.." "..z) | |
| end | |
| end | |
| end | |
| function magicalCity.setWelcome( message) | |
| spell:say("Setze Welcome-Message auf '"..message.."'") | |
| local eventqueue = Events.register("PlayerLoggedInEvent") | |
| for event in eventqueue.next do | |
| local n = event.player.name | |
| spell:whisper( n, "Willkommen, "..n.."!") | |
| if message ~= nil then | |
| spell:whisper( n, message) | |
| end | |
| end | |
| end | |
| function magicalCity.handleArchitectTaggedEvent() | |
| spell:say("Starte 'architect-tagged' Event-Handler") | |
| local eventqueue = Events.register( "architect-tagged") | |
| for event in eventqueue.next do | |
| magicalCity.makeArchitectCreative( event.data.player) | |
| end | |
| end | |
| function magicalCity.makeArchitectsCreative() | |
| local pnames = Players.names() | |
| for _,pname in pairs( pnames) do | |
| magicalCity.makeArchitectCreative( pname) | |
| end | |
| end | |
| function magicalCity.makeArchitectCreative( pname) | |
| local p = Players.getByName( pname) | |
| if p:hasTag( "architect-tag") then | |
| spell:execute( 'gamemode creative '..pname) | |
| else | |
| spell:execute( 'gamemode adventure '..pname) | |
| end | |
| end | |
| function magicalCity.handlePlayerJoined() | |
| spell:say("Starte PlayerLoggedInEvent-Handler") | |
| local eventqueue = Events.register( "PlayerLoggedInEvent") | |
| for event in eventqueue.next do | |
| magicalCity.makeArchitectCreative( event.player.name) | |
| magicalCity.restartArchitect( event.player.name) | |
| end | |
| end | |
| function magicalCity.restartArchitects() | |
| spell:say("Suche nach Architekten und starte den Architekt-Zauber fuer diese.") | |
| local pnames = Players.names() | |
| for _,pname in pairs( pnames) do | |
| magicalCity.restartArchitect( pname) | |
| end | |
| end | |
| function magicalCity.restartArchitect( pname) | |
| local player = Players.getByName( pname) | |
| if player:hasTag( "architect-tag") then | |
| architect.stop( player.name) | |
| sleep(1) | |
| spell:execute( 'lua architect.start("'..player.name..'")') | |
| end | |
| end | |
| function magicalCity.provideBook() | |
| spell:say("Starte ChatEvent-Handler fuer BOOK Zauber") | |
| local eventqueue = Events.register( "ChatEvent") | |
| --for event in eventqueue.next do | |
| while true do | |
| local event = eventqueue.next(50) | |
| if event ~= nil then | |
| if event.message == "BOOK" then | |
| writeBook( createBookDataTag( magicalCity.Book1()), event.player.name) | |
| end | |
| else | |
| end | |
| end | |
| end | |
| function magicalCity.architectAura() | |
| spell:say("Starte Architect-Aura") | |
| local e = "@a[tag=architect-tag]" | |
| p1 = p1 or "enchantmenttable" | |
| while true do | |
| local x=math.random()-0.5 | |
| local y=math.random() | |
| local z=math.random()-0.5 | |
| spell:execute( "/execute "..e.." ~"..x.." ~"..y.." ~"..z.." particle "..p1.." ~ ~ ~ 0 1 0 1.5 4") | |
| sleep( 8) | |
| end | |
| end | |
| function magicalCity.Book1() | |
| local title = "Der Zauber der Architektur" | |
| local author = "MickKay, Erzmagier von Lua" | |
| -- a book has 19 characters per line and 14 lines | |
| local pages = { | |
| --34567890123456789 | |
| page([[ | |
| Der Zauber | |
| der | |
| Architektur | |
| von MickKay | |
| dem | |
| Erzmagier von Lua | |
| ]]), | |
| --34567890123456789 | |
| page([[ | |
| Das Leben eines | |
| Architekten in | |
| Minecraft ist | |
| nicht immer leicht, | |
| vor allem wenn | |
| er grosse Bau- | |
| werke erschaffen | |
| will. Denn das | |
| ist viel Arbeit. | |
| ]]), | |
| --34567890123456789 | |
| page([[ | |
| Dieses Buch | |
| will allen | |
| Architekten | |
| zeigen, wie | |
| sie ihre Arbeit | |
| durch Zauber- | |
| sprueche | |
| vereinfachen | |
| koennen. | |
| ]]), | |
| --34567890123456789 | |
| page([[ | |
| ARCHITECT | |
| ------------------- | |
| Dies ist der | |
| Spruch, der dich | |
| zum Architekten | |
| macht. | |
| Tippe im Chat | |
| folgendes ein: | |
| ARCHITECT | |
| Wichtig - beachte | |
| die Schreibweise! | |
| ]]), | |
| --34567890123456789 | |
| page([[ | |
| Das Wort ist | |
| englisch, und alle | |
| Buchstaben | |
| sind gross ge- | |
| schrieben. | |
| Wenn du dich | |
| vertippst, dann | |
| funktioniert | |
| der Spruch nicht. | |
| Das gilt auch fuer | |
| die anderen | |
| Sprueche. | |
| ]]), | |
| --34567890123456789 | |
| page([[ | |
| Der Spruch | |
| ARCHITECT | |
| versetzt dich in | |
| den Kreativ-Modus. | |
| Ausserdem umgibt | |
| dich nun die | |
| Aura des einfachen | |
| Zauberkundigen: | |
| Magische Symbole | |
| umtanzen dich. | |
| ]]), | |
| --34567890123456789 | |
| page([[ | |
| Aber das Wichtigste | |
| ist: nun kannst | |
| du verschiedene | |
| Architekten- | |
| Sprueche | |
| benutzen: | |
| BAR, WALL, CUBE, | |
| FLOOR, REPLACE, | |
| DELETE und OFF. | |
| Zuruek in den | |
| Ueberlebens- | |
| Modus kommst | |
| ]]), | |
| --34567890123456789 | |
| page([[ | |
| du mit STOP. | |
| Auf den naechsten | |
| Seiten werden | |
| die Sprueche | |
| erklaert. | |
| Viel Spass | |
| beim Ausprobieren! | |
| ]]), | |
| --34567890123456789 | |
| page([[ | |
| BAR | |
| ------------------- | |
| BAR versetzt dich | |
| in den Balken- | |
| Modus. | |
| Beim Setzen eines | |
| Blocks kannst | |
| du damit gleich | |
| mehrere auf | |
| einmal setzen. | |
| Standardmaessig | |
| sind das 5 | |
| Bloecke. | |
| ]]), | |
| --34567890123456789 | |
| page([[ | |
| BAR # | |
| ------------------- | |
| BAR # versetzt dich | |
| in den Balken- | |
| Modus mit # | |
| Bloecken. | |
| Anstatt von # | |
| musst du eine | |
| Zahl eingeben. | |
| Beispielsweise | |
| sorgt BAR 3 | |
| dafuer, dass du | |
| immer 3 Bloecke | |
| auf einmal setzt. | |
| ]]), | |
| --34567890123456789 | |
| page([[ | |
| FLOOR | |
| ------------------- | |
| FLOOR versetzt dich | |
| in den Boden- | |
| oder Decken-Modus. | |
| Klicke innen auf | |
| den Rand einer | |
| horizontal | |
| umschlossenen | |
| Flaeche, und | |
| der Zauber fuellt | |
| die Flaeche auf | |
| bis zum Rand. | |
| ]]), | |
| --34567890123456789 | |
| page([[ | |
| WALL | |
| ------------------- | |
| WALL versetzt dich | |
| in den Wand-Modus. | |
| Klicke innen auf | |
| den Rand einer | |
| vertikal | |
| umschlossenen | |
| Flaeche, und | |
| der Zauber fuellt | |
| die Flaeche auf | |
| bis zum Rand. | |
| ]]), | |
| --34567890123456789 | |
| page([[ | |
| CUBE | |
| ------------------- | |
| CUBE versetzt dich | |
| in den Wuerfel- | |
| Modus. | |
| Anstatt nur einen | |
| einzelnen Block zu | |
| setzen, setzt du | |
| nun mehrere auf | |
| einmal, und zwar | |
| angeordnet in der | |
| Form eines | |
| Wuerfels. | |
| ]]), | |
| --34567890123456789 | |
| page([[ | |
| CUBE # | |
| ------------------- | |
| CUBE # versetzt dich | |
| in den Wuerfel- | |
| Modus fuer einen | |
| Wuerfel mit | |
| der Seitenlaenge #. | |
| Anstatt von # | |
| musst du eine | |
| Zahl eingeben. | |
| ]]), | |
| --34567890123456789 | |
| page([[ | |
| REPLACE | |
| ------------------- | |
| REPLACE versetzt | |
| dich in den | |
| Ersetzen-Modus. | |
| Wenn du einen Block | |
| auf eine Flaeche | |
| setzt, werden | |
| alle direkt | |
| angeschlossenen | |
| Bloecke des selben | |
| Typs durch den | |
| Neuen ersetzt. | |
| ]]), | |
| --34567890123456789 | |
| page([[ | |
| REPLACE # | |
| ------------------- | |
| REPLACE # versetzt | |
| dich in den | |
| Ersetzen-Modus mit | |
| einem Wirkungs- | |
| radius von #. | |
| Anstatt von # | |
| musst du eine | |
| Zahl eingeben. | |
| ]]), | |
| --34567890123456789 | |
| page([[ | |
| DELETE | |
| ------------------- | |
| DELETE versetzt | |
| dich in den | |
| Loeschen-Modus. | |
| Wenn du einen Block | |
| auf eine Flaeche | |
| setzt, werden | |
| alle direkt | |
| angeschlossenen | |
| Bloecke des selben | |
| Typs mit Luft | |
| ersetzt. | |
| ]]), | |
| --34567890123456789 | |
| page([[ | |
| DELETE # | |
| ------------------- | |
| DELETE # versetzt | |
| dich in den | |
| Loeschen-Modus mit | |
| einem Wirkungs- | |
| radius von #. | |
| Anstatt von # | |
| musst du eine | |
| Zahl eingeben. | |
| ]]), | |
| --34567890123456789 | |
| page([[ | |
| OFF | |
| ------------------- | |
| OFF versetzt dich | |
| in den Vanilla | |
| -Kreativ-Modus. | |
| Nun kannst du | |
| wieder wie | |
| gewohnt arbeiten. | |
| ]]), | |
| --34567890123456789 | |
| page([[ | |
| STOP | |
| ------------------- | |
| STOP beendet den | |
| Architektur-Zauber. | |
| Du wirst damit | |
| wieder in den | |
| Ueberlebens- | |
| Modus versetzt. | |
| Natuerlich kannst | |
| du jederzeit | |
| wieder Architekt | |
| werden. | |
| ]]), | |
| --34567890123456789 | |
| page([[ | |
| Das war's. | |
| Ich hoffe, | |
| du kannst damit | |
| viele schöne | |
| Bauwerke | |
| erschaffen. | |
| Viel Spass! | |
| ]]), | |
| } | |
| return {title=title, author=author, pages=pages} | |
| end | |
| function magicalCity.protectArea( l, w, h) | |
| local oldblk = {} | |
| local snap = {} | |
| local area = selection.box( l, w, h) | |
| for i,pos in pairs( area) do | |
| spell.pos = pos | |
| oldblk[i] = spell.block | |
| local sel = {} | |
| spell:select( sel) | |
| snap[i] = spell:copy( sel) | |
| end | |
| print( "area protected!") | |
| while true do | |
| sleep( 1) | |
| for i,pos in pairs( area) do | |
| spell.pos = pos | |
| if spell.block.name ~= oldblk[i].name then | |
| spell:paste( snap[i]) | |
| end | |
| end | |
| end | |
| end | |
| function magicalCity.protectBlock() | |
| local sel = {} | |
| spell:select( sel) | |
| local snap = spell:copy(sel) | |
| local oldblk = spell.block | |
| while true do | |
| sleep( 5) | |
| if spell.block.name ~= oldblk.name then | |
| spell:paste( snap) | |
| end | |
| end | |
| end | |
| function magicalCity.handleSonne() | |
| spell:say("Starte ChatEvent-Handler fuer SONNE Zauber") | |
| local queue = Events.register( "ChatEvent") | |
| for e in queue.next do | |
| if e.message == "SONNE" then | |
| spell:execute( "time set day") | |
| spell:execute( "weather clear") | |
| end | |
| end | |
| end | |
| home = { | |
| homeDetector = function( r) | |
| r = r or 32 | |
| function sqrtDistanceXZ( p1, p2) | |
| return (p2.x-p1.x) * (p2.x-p1.x) + (p2.z-p1.z) * (p2.z-p1.z) | |
| end | |
| while true do | |
| sleep( 1) | |
| local names = Players.names() | |
| for _,n in pairs( names) do | |
| local should_bless = false | |
| local home_pos_list = home.findHomePositions( n) | |
| local p = Players.getByName( n) | |
| if #home_pos_list > 0 then | |
| local ppos = p.blockPos | |
| for _,center in pairs( home_pos_list) do | |
| local sqrtDist = sqrtDistanceXZ( center, ppos) | |
| if sqrtDist <= r*r then | |
| should_bless = true | |
| end | |
| end | |
| end | |
| if should_bless then | |
| if not p:hasTag("home") then | |
| p:addTag( "home") | |
| Events.fire( "home", {player=p.name}) | |
| end | |
| else | |
| if p:hasTag("home") then | |
| p:removeTag( "home") | |
| Events.fire( "home", {player=p.name}) | |
| end | |
| end | |
| end | |
| end | |
| end | |
| , | |
| findHomePositions = function( pname) | |
| pname = pname or spell.owner.name | |
| result = {} | |
| local p = Players.getByName( pname) | |
| for i=0,35 do | |
| local inv = p:getInventory( i) | |
| if inv ~= nil then | |
| if inv.name == "minecraft:written_book" then | |
| local data = inv:getNbt() | |
| local x,z = home.parsePositionFromBook( data) | |
| if x ~= nil and z ~= nil then | |
| table.insert( result, {x=x, z=z}) | |
| end | |
| end | |
| end | |
| end | |
| return result | |
| end | |
| , | |
| parsePositionFromBook = function( data) | |
| if data == nil then | |
| error( "data is nil") | |
| end | |
| local tag = data.tag | |
| if tag ~= nil then | |
| local pages = tag.pages | |
| if pages ~= nil then | |
| for pn,txt in pairs( pages) do | |
| local x,z = string.match( txt, "x:(%-?%d+).*z:(%-?%d+)") | |
| return x,z | |
| end | |
| end | |
| end | |
| end | |
| , | |
| rightClickHandler = function() | |
| local queue = Events.register( "RightClickBlockEvent") | |
| for evt in queue.next do | |
| -- spell:say( evt.type) | |
| -- spell:say( str( evt.player.mainHand)) | |
| local item = evt.player.mainHand | |
| if item ~= nil then | |
| if item.name == 'minecraft:armor_stand' then | |
| spell:say( item.name) | |
| local data = item:getNbt() | |
| spell:say( str( data)) | |
| end | |
| if item.name == 'minecraft:writable_book' then | |
| local data = item:getNbt() | |
| --say(str(data)) | |
| if data ~= nil then | |
| if data.tag ~= nil then | |
| if data.tag.pages ~= nil then | |
| local page = data.tag.pages[1] | |
| if page ~= nil and page == "home" then | |
| home.createHomeBook( evt.player.name) | |
| end | |
| end | |
| end | |
| end | |
| end | |
| end | |
| end | |
| end | |
| , | |
| homeHandler = function() | |
| local eventQueue = Events.register( "home") | |
| for event in eventQueue.next do | |
| local p = Players.getByName( event.player) | |
| if p.gamemode == "SURVIVAL" or p.gamemode == "ADVENTURE" then | |
| if p:hasTag("home") then | |
| spell:execute('gamemode survival '..p.name) | |
| else | |
| spell:execute('gamemode adventure '..p.name) | |
| end | |
| end | |
| end | |
| end | |
| , | |
| createHomeBook = function( pname) | |
| pname = pname or spell.owner.name | |
| writeBook( createBookDataTag( home.HomeBook( pname)), pname) | |
| end | |
| , | |
| HomeBook = function( pname, title) | |
| local p = Players.getByName( pname) | |
| local pos = p.blockPos | |
| title = title or "Home "..pos.x.." "..pos.z | |
| local author = pname | |
| sleep( 1) | |
| local pages = { | |
| page( "x:"..pos.x.."\nz:"..pos.z) | |
| } | |
| return { title=title, author=author, pages=pages} | |
| end | |
| , | |
| homeAura = function() | |
| local e = "@a[tag=home]" | |
| p1 = p1 or "townaura" | |
| while true do | |
| local x=math.random()-0.5 | |
| local y=math.random() | |
| local z=math.random()-0.5 | |
| spell:execute( "/execute "..e.." ~"..x.." ~"..y.." ~"..z.." particle "..p1.." ~ ~ ~ 0 1 0 1.5 4") | |
| sleep( 8) | |
| end | |
| end | |
| , | |
| giveArmorStand = function( pname, displayName, tag, secret) | |
| local dataTag = '{Secret:"'..secret..'",CustomName:"Home",Tags:["'..tag..'"],display:{Name:"'..displayName..'"} }' | |
| spell:execute( '/give '..pname..' minecraft:armor_stand 1 0 '..dataTag) | |
| end | |
| } | |
| function magicalCity.particle(name) | |
| name = name or "instantSpell" | |
| local pos = getPos() | |
| local x = pos.x | |
| local y = pos.y | |
| local z = pos.z | |
| cmd("particle "..name.." "..x.." "..y.." "..z.." 0 0 0 0 5 force") | |
| end | |
| function magicalCity.mickkays_kamin() | |
| spell.pos = Vec3.from(-1444.60, 75.99, -713.48) | |
| while true do | |
| magicalCity.particle() | |
| sleep(1) | |
| end | |
| end | |
| function magicalCity.jonas_kamin() | |
| spell.pos = Vec3.from(-1245.5,82.5,-450.5) | |
| while true do | |
| magicalCity.particle() | |
| sleep(1) | |
| end | |
| end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment