Noch mehr mods
This commit is contained in:
parent
a063db5d3b
commit
cf017b2ca1
527 changed files with 21113 additions and 181 deletions
101
mods/hot_air_balloons/absent_ballooner_rescuing.lua
Normal file
101
mods/hot_air_balloons/absent_ballooner_rescuing.lua
Normal file
|
@ -0,0 +1,101 @@
|
|||
--localize things for better performance
|
||||
local serialize = minetest.serialize
|
||||
local add_entity = minetest.add_entity
|
||||
local after = minetest.after
|
||||
|
||||
--for storing which players left while in a balloon
|
||||
local storage = minetest.get_mod_storage()
|
||||
local absent_ballooners = minetest.deserialize(storage:get_string("absent_ballooners")) or {}
|
||||
|
||||
|
||||
--putting leaving people into storage
|
||||
local leave_while_ballooning = function(player)
|
||||
local parent = player:get_attach()
|
||||
if parent and not parent:is_player()
|
||||
then
|
||||
local balloon_type = parent:get_luaentity().balloon_type
|
||||
if balloon_type
|
||||
then
|
||||
--remove() only works if someone else is in the area,
|
||||
--hence the need for mark_for_deletion
|
||||
parent:remove()
|
||||
absent_ballooners[player:get_player_name()] = balloon_type
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--same as on_leave but for all players at once
|
||||
local on_shutdown = function()
|
||||
local connected_players = minetest.get_connected_players()
|
||||
for i, p in ipairs(connected_players)
|
||||
do
|
||||
leave_while_ballooning(p)
|
||||
end
|
||||
storage:set_string("absent_ballooners", serialize(absent_ballooners))
|
||||
end
|
||||
--putting leaving people into storage and saving storage
|
||||
local on_leave = function(player)
|
||||
leave_while_ballooning(player)
|
||||
storage:set_string("absent_ballooners", serialize(absent_ballooners))
|
||||
end
|
||||
|
||||
minetest.register_on_leaveplayer(on_leave)
|
||||
minetest.register_on_shutdown(on_shutdown)
|
||||
|
||||
--checking if player who joined was ballooning when they left
|
||||
--if so spawn a new balloon and set them as attachment
|
||||
local on_join = function(player)
|
||||
if player
|
||||
then
|
||||
local name = player:get_player_name()
|
||||
if absent_ballooners[name]
|
||||
then
|
||||
local pos = player:get_pos()
|
||||
|
||||
--for compatibility with version 1.1 of the mod
|
||||
if absent_ballooners[name] == true
|
||||
then
|
||||
absent_ballooners[name] = "hot_air_balloons:balloon"
|
||||
end
|
||||
--minetest doesn't seem to like add_entity on init so a minetest.after is used
|
||||
--player is set as pilot in on_activate
|
||||
after(2,
|
||||
function()
|
||||
--concatenating "P" with name signals that player should be set as attach
|
||||
add_entity(pos, absent_ballooners[name], "P" .. name)
|
||||
end)
|
||||
end
|
||||
end
|
||||
end
|
||||
minetest.register_on_joinplayer(on_join)
|
||||
|
||||
|
||||
--called in on_activate if balloon was spawned to rescue an absent ballooner
|
||||
local set_rescue = function(self, playername)
|
||||
local player = minetest.get_player_by_name(playername)
|
||||
self.pilot = playername
|
||||
if not player --player logged off right away
|
||||
then
|
||||
self.object:remove()
|
||||
return
|
||||
end
|
||||
player:set_attach(self.object, "",
|
||||
{x = 0, y = 1, z = 0}, {x = 0, y = 0, z = 0})
|
||||
absent_ballooners[playername] = nil
|
||||
end
|
||||
--set as get_staticdata
|
||||
local mark_for_deletion = function(self)
|
||||
if self.pilot
|
||||
then
|
||||
--pilot logged off while ballooning, deleting balloon on next activation
|
||||
return "R"
|
||||
else
|
||||
--normally save and load balloon
|
||||
return ""
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
return set_rescue, mark_for_deletion
|
||||
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue