Skip to content

Instantly share code, notes, and snippets.

@mkarneim
Last active August 21, 2017 18:50
Show Gist options
  • Select an option

  • Save mkarneim/937afb517191e446008fb80a0abfbe14 to your computer and use it in GitHub Desktop.

Select an option

Save mkarneim/937afb517191e446008fb80a0abfbe14 to your computer and use it in GitHub Desktop.
Magical City Spells
-- 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