aboutsummaryrefslogtreecommitdiff
path: root/spawns.lua
blob: d56afbea344352e5e3fa56943fa45534ed36efb4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
skycraft.spawn_offset = {x = 3, y = 2, z = 0}

skycraft.starter_mobs = {"mobs_mc:cow", "mobs_mc:sheep", "mobs_mc:pig"}

do
	local file = io.open(minetest.get_modpath("skycraft") .. "/schems/island.we", "r")
	skycraft.island_schem = file:read()
	file:close()
end

skycraft.savedata.spawns = skycraft.savedata.spawns or {} 

function skycraft.get_spawn(player)
	local strpos = player:get_meta():get_string("skycraft:spawn")
	if not strpos == "" then return end
	return minetest.string_to_pos(strpos)
end

function skycraft.set_spawn(player, pos)
	player:get_meta():set_string("skycraft:spawn", minetest.pos_to_string(pos))
end

function skycraft.spawn_player(player)
	local spawn = skycraft.get_spawn(player)
	local name = player:get_player_name()
	if not spawn then
		local plot = skycraft.claim_plot(name)
		spawn = {x = plot.x * 62 + 31, z = plot.z * 62 + 31, y = math.random(1600, 2000)}
		minetest.chat_send_player(name, "Creating Island ...")
		skycraft.set_spawn(player, spawn)
		local physics = player:get_physics_override()
		player:set_physics_override({gravity = 0})
		minetest.after(5, function()
			worldedit.deserialize(vector.add(spawn, {x = -6, y = -6, z = -4}), skycraft.island_schem)
			local nametag = name .. "'s Friend"
			local entity = minetest.add_entity(vector.add(spawn, {x = -4.5, y = 1, z = 1.5}), skycraft.starter_mobs[math.random(#skycraft.starter_mobs)])
			entity:get_luaentity().nametag = nametag
			entity:set_properties({nametag = nametag})
			player:set_physics_override(physics)
		end)
	end
	player:set_pos(vector.add(spawn, skycraft.spawn_offset))
end

minetest.register_on_respawnplayer(function(player)
	local spawn = mcl_spawn.get_spawn_pos(player)
	player:set_pos(spawn)
	return true
end)

minetest.register_on_mods_loaded(function()
	function mcl_spawn.get_spawn_pos(player)
		local name = player:get_player_name()
		local spawn, custom_spawn
		local bed_spawn = player:get_meta():get_string("mcl_beds:spawn")
		if bed_spawn and bed_spawn ~= "" then
			spawn, custom_spawn = minetest.string_to_pos(bed_spawn), true
		end
		if spawn and custom_spawn then
			local node_bed = skycraft.get_far_node(spawn)
			local node_up1 = skycraft.get_far_node(vector.add(spawn, {x = 0, y = 1, z = 0}))
			local node_up2 = skycraft.get_far_node(vector.add(spawn, {x = 0, y = 2, z = 0}))
			local bgroup = minetest.get_item_group(node_bed.name, "bed")
			local def1 = minetest.registered_nodes[node_up1.name]
			local def2 = minetest.registered_nodes[node_up2.name]
			if bgroup ~= 1 and bgroup ~= 2 or def1.walkable or def2.walkable or def1.damage_per_second and def1.damage_per_second > 0 or def2.damage_per_second and def2.damage_per_second > 0 then
				if bgroup ~= 1 and bgroup ~= 2 then
					mcl_spawn.set_spawn_pos(player, nil)
				end
				spawn, custom_spawn = nil, false
				minetest.chat_send_player(name, minetest.get_translator("mcl_beds")("Your spawn bed was missing or blocked."))
			end
		end
		if not spawn then
			spawn = mcl_spawn.get_world_spawn_pos(), false
		end
		local island_spawn = skycraft.get_spawn(player)
		if not custom_spawn and island_spawn then
			spawn = vector.add(island_spawn, skycraft.spawn_offset)
		end
		return spawn, custom_spawn
	end
end)