Oh wow, it looks just like Portal. This is amazing. But it got me thinking, I wonder if anyone can create some sort of software mod for infdev that can make portals...
Oh wow, it looks just like Portal. This is amazing. But it got me thinking, I wonder if anyone can create some sort of software mod for infdev that can make portals...
for i=1, #game.Players.Lilyo:InternetsWon() do
Instance.new("Brain Explosion").Parent = game.Players.LocalPlayer.Character.Head
end
minecraft.Mods:GetMod("PortalCraft")
This requires scripting, so I assume it wouldn't work in, say, MC# servers? Also, more videos please!
Rollback Post to RevisionRollBack
"Urist McWackoMcGoose cancels Mod Minecraft: Discovered Dwarf Fortress"
Ancient sig archive:
Paper Minecraft: Legend of the Music Discs... is on hiatus until I get a new high-end gaming laptop! Episode 2-4: watch?v=Lk4TjTnUJYU
gm_portal = {}
gm_portal.__index = gm_portal
function gm_portal.start(level)
if not Gravity then dofile "scripts/plugins/gravity.lua" end
Gravity.blocks[14] = true
Gravity.blocks[15] = true
local object = {
running = true,
level = level,
players = {}
}
setmetatable(object,gm_portal)
Gravity.Fall = function(args) object:fall(args) end
object.handler = server.PlayerLoginEvent:Add(function(player)
object.players[player] = object:join(player)
end)
for i = 0,server.Players.Count-1 do
object:join(server.Players[i])
end
return object
end
function gm_portal:destroy()
self.running = false
self.level = nil
self.players = {}
server.PlayerLoginEvent:Remove(self.handler)
for k,v in pairs(self.players) do
k.MoveEvent:Remove(v.move_handle)
k.BlockEvent:Remove(v.block_handle)
k.DisconnectedEvent:Remove(v.leave_handle)
self:leave(v)
end
end
function gm_portal:join(player)
local p = { orange = nil, blue = nil, portal = nil,
build = false, inlava = false, infizzle = false }
p.move_handler = player.MoveEvent:Add(function() self:move(player) end)
p.block_handler = player.BlockEvent:Add(function(player,args,holding)
local p = self.players[player]
if not p.build then
self:block(player,args.X,args.Y,args.Z,args.Type,holding)
args.Abort = true
end
end)
p.leave_handler = player.DisconnectedEvent:Add(function()
self:leave(p)
end)
self.players[player] = p
return p
end
function gm_portal:leave(p)
if p.portal then
p.portal:destroy()
p.portal = nil
end
if p.orange then
for pos,block in pairs(p.orange.blocks) do
self.level:SetBlock(nil,pos[1],pos[2],pos[3],block)
end
p.orange.region:Destroy()
p.orange = nil
end
if p.blue then
for pos,block in pairs(p.blue.blocks) do
self.level:SetBlock(nil,pos[1],pos[2],pos[3],block)
end
p.blue.region:Destroy()
p.blue = nil
end
end
function gm_portal:block(player,x,y,z,block,holding)
local p = self.players[player]
if block ~= 0 then return end
local b = self.level:GetBlock(x,y,z)
if Gravity.blocks[b] then
self:push(player,x,y,z,:cool.gif:
return
end
if p.infizzle or (holding ~= 22 and holding ~= 28) or
not self:free(x,y,z) then return end
local rot = -1
local size = 2
local relY = 0
if self:air(x-1,y,z) and self:air(x-1,y+1,z) then rot = 64 end
if self:air(x+1,y,z) and self:air(x+1,y+1,z) then
if rot >= 0 then return else rot = 192 end
end
if self:air(x,y-1,z) then
if rot >= 0 then return else
rot = math.floor(player.Position.RotX/64+0.5)*64
size = 1
relY = -20
end
end
if self:air(x,y+1,z) then
if rot >= 0 then return else
rot = math.floor(player.Position.RotX/64+0.5)*64
size = 1
relY = 20
end
end
if self:air(x,y,z-1) and self:air(x,y+1,z-1) then
if rot >= 0 then return else rot = 0 end
end
if self:air(x,y,z+1) and self:air(x,y+1,z+1) then
if rot >= 0 then return else rot = 128 end
end
if rot < 0 then return end
if size == 2 and not self:free(x,y+1,z) then return end
local region = Region(self.level,x,y,z,x+1,y+size,z+1)
if p.portal then
p.orange = {
region = p.portal.first.region,
rot = p.portal.first.rot,
y = p.portal.first.y,
blocks = {}
}
p.blue = {
region = p.portal.second.region,
rot = p.portal.second.rot,
y = p.portal.second.y,
blocks = {}
}
p.portal:destroy()
for x = p.orange.region.X1,p.orange.region.X2 do
for y = p.orange.region.Y1,p.orange.region.Y2 do
for z = p.orange.region.Z1,p.orange.region.Z2 do
p.orange.blocks[{x,y,z}] = self.level:GetBlock(x,y,z)
end
end
end
for x = p.blue.region.X1,p.blue.region.X2 do
for y = p.blue.region.Y1,p.blue.region.Y2 do
for z = p.blue.region.Z1,p.blue.region.Z2 do
p.blue.blocks[{x,y,z}] = self.level:GetBlock(x,y,z)
end
end
end
end
if holding == 22 then
if p.orange then
for pos,block in pairs(p.orange.blocks) do
self.level:SetBlock(nil,pos[1],pos[2],pos[3],block)
end
p.orange.region:Destroy()
end
p.orange = { region = region, rot = rot, y = relY, blocks = {} }
for x = region.X1,region.X2 do
for y = region.Y1,region.Y2 do
for z = region.Z1,region.Z2 do
p.orange.blocks[{x,y,z}] = self.level:GetBlock(x,y,z)
end
end
end
if p.blue then self:portal(p)
else self.level:Cuboid(nil,p.orange.region,22) end
elseif holding == 28 then
if p.blue then
for pos,block in pairs(p.blue.blocks) do
self.level:SetBlock(nil,pos[1],pos[2],pos[3],block)
end
p.blue.region:Destroy()
end
p.blue = { region = region, rot = rot, y = relY, blocks = {} }
for x = region.X1,region.X2 do
for y = region.Y1,region.Y2 do
for z = region.Z1,region.Z2 do
p.blue.blocks[{x,y,z}] = self.level:GetBlock(x,y,z)
end
end
end
if p.orange then self:portal(p)
else self.level:Cuboid(nil,p.blue.region,28) end
end
end
function gm_portal:portal(p)
for pos,block in pairs(p.orange.blocks) do
self.level:SetBlock(nil,pos[1],pos[2],pos[3],block)
end
for pos,block in pairs(p.blue.blocks) do
self.level:SetBlock(nil,pos[1],pos[2],pos[3],block)
end
p.portal = portal.create(self.level,p.orange.region,p.blue.region)
p.portal.first.rot = p.orange.rot
p.portal.second.rot = p.blue.rot
p.portal.first.y = p.orange.y
p.portal.second.y = p.blue.y
p.orange = nil
p.blue = nil
end
function gm_portal:move(player)
local p = self.players[player]
if not p.build then
local x = math.floor(player.Position.X/32)
local y = math.floor(player.Position.Y/32)-1
local z = math.floor(player.Position.Z/32)
if x<0 or y<0 or z<0 or x>=self.level.Width or
y>=self.level.Depth or z>=self.level.Height then return end
local block = self.level:GetBlock(x,y,z)
if block == 10 then
if not p.inlava then
Message("&c*"..player.Group.Prefix..player.Name..player.Group.Postfix.."&c died."):Send(self.level)
player:Teleport(self.level.Spawn)
self:leave(p)
p.inlava = true
end
else p.inlava = false end
if block == 37 or block == 38 then
if not p.infizzle then
self:leave(p)
p.infizzle = true
end
else p.infizzle = false end
end
end
function gm_portal:push(player,x,y,z,block)
local rot = math.floor(player.Position.RotX/64+0.5)*64 % 256
if math.sqrt((x+0.5-player.Position.X/32)^2 +
(y+1.5-player.Position.Y/32)^2 +
(z+0.5-player.Position.Z/32)^2) > 2 then return end
local pos = nil
if rot == 0 then pos = { 0,0,-1 }
elseif rot == 64 then pos = { 1,0,0 }
elseif rot == 128 then pos = { 0,0,1 }
else pos = { -1,0,0 } end
if not self:air(x-pos[1],y-pos[2],z-pos[3]) then return end
local b = self.level:GetBlock(x+pos[1],y+pos[2],z+pos[3])
if b == 9 or b == 11 then
self:tele_block(x,y,z,x+pos[1],y+pos[2],z+pos[3])
elseif b == 37 or b == 38 then
self.level:SetBlockData(x,y,z,0)
self.level:SetBlock(nil,x,y,z,0)
else
if self.level:GetBlock(x+pos[1],y+pos[2],z+pos[3]) ~= 0 then return end
self.level:SetBlock(nil,x+pos[1],y+pos[2],z+pos[3],block)
self.level:SetBlockData(x,y,z,0)
self.level:SetBlock(nil,x,y,z,0)
end
end
function gm_portal:fall(args)
local _,x,y,z,counter = unpack(args)
local above = self.level:GetBlock(x,y,z)
if not Gravity.blocks[above] then return end
if self.level:GetBlockData(x,y,z) ~= counter then return end
local below = self.level:GetBlock(x,y-1,z)
if below == 0 then
self.level:SetBlock(nil,x,y-1,z,above)
self.level:SetBlockData(x,y,z,0)
self.level:SetBlock(nil,x,y,z,0)
elseif below == 9 or below == 11 then
self:tele_block(x,y,z,x,y-1,z)
elseif below == 10 then
self.level:SetBlock(nil,x,y,z,0)
end
end
function gm_portal:tele_block(xfrom,yfrom,zfrom,xto,yto,zto)
local block = self.level:GetBlock(xfrom,yfrom,zfrom)
local regions = self.level:RegionsAt(xto,yto,zto)
for i = 0,regions.Count-1 do
local region = regions[i]
if region.Tag and region.Tag.type and region.Tag.type == "portal" then
local target = nil
if region == region.Tag.first.region then
target = region.Tag.second
else target = region.Tag.first end
local pos = nil
if target.y < 0 then pos = { target.region.X1,target.region.Y1-1,target.region.Z1 }
elseif target.y > 0 then pos = { target.region.X1,target.region.Y1+1,target.region.Z1 }
else
if target.rot == 0 then pos = { target.region.X1,target.region.Y1,target.region.Z1-1 }
elseif target.rot == 64 then pos = { target.region.X1-1,target.region.Y1,target.region.Z1 }
elseif target.rot == 128 then pos = { target.region.X1,target.region.Y1,target.region.Z1+1 }
else pos = { target.region.X1+1,target.region.Y1,target.region.Z1 } end
end
if self.level:GetBlock(pos[1],pos[2],pos[3]) == 0 then
self.level:SetBlock(nil,pos[1],pos[2],pos[3],block)
self.level:SetBlockData(xfrom,yfrom,zfrom,0)
self.level:SetBlock(nil,xfrom,yfrom,zfrom,0)
else
self.level:SetBlockData(xfrom,yfrom,zfrom,Gravity.counter+1)
server.Queue:Add(400,Gravity.Fall,{nil,xfrom,yfrom,zfrom,Gravity.counter+1})
Gravity.counter = (Gravity.counter + 1) % 255
end
end
end
end
function gm_portal:free(x,y,z)
local block = self.level:GetBlock(x,y,z)
if block == 5 then return true
elseif block == 17 then return true
elseif block == 47 then return true
else return false end
end
function gm_portal:air(x,y,z)
local block = self.level:GetBlock(x,y,z)
if block == 0 then return true
elseif block == 14 then return true
elseif block == 15 then return true
else return false end
end
Command("build","[<player>]","Chages if a player is in build mode.",
function(command,player,message)
if portal_inst == nil then
Message("&ePortal gamemode isn't running."):Send(player)
return
end
local target = player
if message ~= "" then
target = FindPlayer(message)
if target == nil then
Message("&eThere is no player '"..message.."'."):Send(player)
return
end
end
local p = portal_inst.players[target]
local text = nil
p.build = not p.build
if p.build then
text = "build"
portal_inst:leave(p)
else
text = "portal"
end
if player ~= target then
Message("&e"..target.Name.." is "..text.." now in "..text.." mode."):Send(player)
end
Message("&eYou are now in "..text.." mode."):Send(target)
end
)
portal_inst = gm_portal.start(server.Level)
dofile "scripts/plugins/portals.lua"
dofile "scripts/plugins/buttons.lua"
I absolutely love it! Excellent work ^-^
Already exists..
Also, nice texture pack.
Did you just build a copy of the room on the other side of the portal?
Classic Server: Link Removed
Our Forum: Minecraft Collaboration Forum
[STAFF NEEDED, PM ME]
Instance.new("Brain Explosion").Parent = game.Players.LocalPlayer.Character.Head
end
minecraft.Mods:GetMod("PortalCraft")
This requires scripting, so I assume it wouldn't work in, say, MC# servers? Also, more videos please!
"Urist McWackoMcGoose cancels Mod Minecraft: Discovered Dwarf Fortress"
Ancient sig archive:
Paper Minecraft: Legend of the Music Discs... is on hiatus until I get a new high-end gaming laptop! Episode 2-4: watch?v=Lk4TjTnUJYU
is that for obsidian?
does it work?
where to get it? :biggrin.gif:
:sad.gif:
when do you finish it?????
But the freaken cake is a lie god damnit!!!!!!!!!! ):!
its a lie, don’t take it!