diff --git a/mods/central_message/init.lua b/mods/central_message/init.lua index b4482b8..5c3dac6 100644 --- a/mods/central_message/init.lua +++ b/mods/central_message/init.lua @@ -73,7 +73,16 @@ cmsg.push_message_player = function(player, text) end minetest.after(5, function(param) + if not param.player then + return + end local pname = param.player:get_player_name() + if not pname then + return + end + if not cmsg.messages[pname] then + return + end for i=1, #cmsg.messages[pname] do if param.msgid == cmsg.messages[pname][i].msgid then table.remove(cmsg.messages[pname], i) diff --git a/mods/central_message/init.lua~ b/mods/central_message/init.lua~ new file mode 100644 index 0000000..5c3dac6 --- /dev/null +++ b/mods/central_message/init.lua~ @@ -0,0 +1,123 @@ +cmsg = {} +cmsg.hudids = {} +cmsg.messages = {} +cmsg.settings = {} +cmsg.next_msgids = {} + +cmsg.settings.max_messages = 7 +local setting = minetest.setting_get("central_message_max") +if type(tonumber(setting)) == "number" then + cmsg.settings.max_messages = tonumber(setting) +elseif setting == "inf" then + cmsg.settings.max_messages = nil +end + +cmsg.settings.color = 0xFFFFFF +setting = minetest.setting_get("central_message_color") +if type(tonumber(setting)) == "number" then + cmsg.settings.color = tonumber(setting) +end + +local function update_display(player, pname) + local messages = {} + local start, stop + stop = #cmsg.messages[pname] + if cmsg.settings.max_messages ~= nil then + local max = math.min(cmsg.settings.max_messages, #cmsg.messages[pname]) + if #cmsg.messages[pname] > cmsg.settings.max_messages then + start = stop - max + else + start = 1 + end + else + start = 1 + end + for i=start, stop do + table.insert(messages, cmsg.messages[pname][i].text) + end + local concat = table.concat(messages, "\n") + player:hud_change(cmsg.hudids[pname], "text", concat) +end + +cmsg.push_message_player = function(player, text) + local function push(tbl) + -- Horrible Workaround code starts here + if not (cmsg.last_push < cmsg.steps) then + minetest.after(0, push, tbl) + return + end + + local player = tbl.player + local text = tbl.text + -- Horrible Workaround code ends here + + local pname = player:get_player_name() + if cmsg.hudids[pname] == nil then + cmsg.hudids[pname] = player:hud_add({ + hud_elem_type = "text", + text = text, + number = cmsg.settings.color, + position = {x=0.5, y=0.5}, + offset = {x=-0,y=-256}, + direction = 3, + alignment = {x=0,y=1}, + scale = {x=800,y=20*cmsg.settings.max_messages}, + }) + cmsg.messages[pname] = {} + cmsg.next_msgids[pname] = 0 + table.insert(cmsg.messages[pname], {text=text, msgid=cmsg.next_msgids[pname]}) + else + cmsg.next_msgids[pname] = cmsg.next_msgids[pname] + 1 + table.insert(cmsg.messages[pname], {text=text, msgid=cmsg.next_msgids[pname]}) + update_display(player, pname) + end + + minetest.after(5, function(param) + if not param.player then + return + end + local pname = param.player:get_player_name() + if not pname then + return + end + if not cmsg.messages[pname] then + return + end + for i=1, #cmsg.messages[pname] do + if param.msgid == cmsg.messages[pname][i].msgid then + table.remove(cmsg.messages[pname], i) + break + end + end + update_display(player, pname) + end, {player=player, msgid=cmsg.next_msgids[pname]}) + + -- Update timer for Horrible Workaround + cmsg.last_push = cmsg.steps + end + + if cmsg.last_push < cmsg.steps then + push({player=player, text=text}) + else + minetest.after(0, push, {player=player, text=text}) + end +end + +cmsg.push_message_all = function(text) + local players = minetest.get_connected_players() + for i=1,#players do + cmsg.push_message_player(players[i], text) + end +end + +minetest.register_on_leaveplayer(function(player) + cmsg.hudids[player:get_player_name()] = nil +end) + +-- Horrible Workaround code starts here +cmsg.steps = 0 +cmsg.last_push = -1 +minetest.register_globalstep(function(dtime) + cmsg.steps = cmsg.steps + 1 +end) +-- Horrible Workaround code ends here diff --git a/mods/pets/init.lua b/mods/pets/init.lua index 3f3054a..8a027ae 100644 --- a/mods/pets/init.lua +++ b/mods/pets/init.lua @@ -1,73 +1,100 @@ +pets = {} +pets.players_pets = {} + local function get_velocity(v, yaw, y) local x = -math.sin(yaw) * v local z = math.cos(yaw) * v return {x = x, y = y, z = z} end -minetest.register_entity("pets:pig", { +function pets.register_pet(name, def) + minetest.register_entity(name, { + hp_max = def.hp_max, + physical = true, + collisionbox = def.collisionbox, + visual = "mesh", + visual_size = {x=1, y=1}, + mesh = def.mesh, + textures = def.textures, + spritediv = {x=1, y=1}, + initial_sprite_basepos = {x=0, y=0}, + is_visible = true, + makes_footstep_sound = false, + automatic_rotate = true, + speed = 0, + pl = nil, + + on_rightclick = function(self, clicker) + if not clicker or not clicker:is_player() then + return + end + if pets.players_pets[clicker:get_player_name()] then + cmsg.push_message_player(clicker, "[pet] You already have a pet!") + else + pets.players_pets[clicker:get_player_name()] = name + cmsg.push_message_player(clicker, "[pet] + ".. def.description) + self.pl = clicker + end + end, + + on_step = function(self, dtime) + if self.pl ~= nil then + if self.pl:getpos() then + if vector.distance(self.object:getpos(), self.pl:getpos()) > 2 then + local vec = vector.direction(self.object:getpos(), self.pl:getpos()) + vec.y = vec.y * 10 + self.object:setvelocity(vector.multiply(vec, 3)) + local yaw = math.atan(vec.z/vec.x)+math.pi/2 + yaw = yaw+(math.pi/2) + if self.pl:getpos().x > self.object:getpos().x then + yaw = yaw+math.pi + end + self.object:setyaw(yaw) + end + if vector.distance(self.object:getpos(), self.pl:getpos()) > 15 then + local vec = self.pl:getpos() + vec.x = vec.x + math.random(-3, 3) + vec.z = vec.z + math.random(-3, 3) + vec.y = vec.y + 3 + self.object:setpos(vec) + end + end + else + if math.random(0, 50) == 15 then + local vec = {x=math.random(-3, 3), y=-4, z=math.random(-3, 3)} + self.object:setvelocity(vec) + local yaw = math.atan(vec.z/vec.x)+math.pi/2 + yaw = yaw+(math.pi/2) + if vec.x + self.object:getpos().x > self.object:getpos().x then + yaw = yaw+math.pi + end + self.object:setyaw(yaw) + end + end + end, + }) + + minetest.register_craftitem(name, { + description = def.description, + inventory_image = "pets_"..def.description.."_spawn.png", + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + minetest.add_entity(pointed_thing.above, name) + if not minetest.setting_getbool("creative_mode") then + itemstack:take_item() + end + return itemstack + end, + }) +end + +pets.register_pet("pets:pig", { + description = "pig", hp_max = 30, - physical = true, collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5}, - visual = "mesh", - visual_size = {x=1, y=1}, mesh = "pets_pig.x", textures = {"pets_pig.png",}, - spritediv = {x=1, y=1}, - initial_sprite_basepos = {x=0, y=0}, - is_visible = true, - makes_footstep_sound = false, - automatic_rotate = true, - speed = 0, - pl = nil, - - on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, direction) - if not puncher or not puncher:is_player() then - return - end - self.pl = puncher - cmsg.push_message_player(puncher, "[pet] pig") - end, - - on_step = function(self, dtime) - if self.pl ~= nil then - if vector.distance(self.object:getpos(), self.pl:getpos()) > 2 then - local vec = vector.direction(self.object:getpos(), self.pl:getpos()) - vec.y = vec.y * 10 - self.object:setvelocity(vector.multiply(vec, 3)) - local yaw = math.atan(vec.z/vec.x)+math.pi/2 - yaw = yaw+(math.pi/2) - if self.pl:getpos().x > self.object:getpos().x then - yaw = yaw+math.pi - end - self.object:setyaw(yaw) - end - else - if math.random(0, 50) == 15 then - local vec = {x=math.random(-3, 3), y=-4, z=math.random(-3, 3)} - self.object:setvelocity(vec) - local yaw = math.atan(vec.z/vec.x)+math.pi/2 - yaw = yaw+(math.pi/2) - if vec.x + self.object:getpos().x > self.object:getpos().x then - yaw = yaw+math.pi - end - self.object:setyaw(yaw) - end - end - end, -}) - -minetest.register_craftitem("pets:pig", { - description = "Pig", - inventory_image = "pets_pig_spawn.png", - - on_place = function(itemstack, placer, pointed_thing) - if pointed_thing.type ~= "node" then - return - end - minetest.add_entity(pointed_thing.above, "pets:pig") - if not minetest.setting_getbool("creative_mode") then - itemstack:take_item() - end - return itemstack - end, }) diff --git a/mods/pets/init.lua~ b/mods/pets/init.lua~ index 3f3054a..8a027ae 100644 --- a/mods/pets/init.lua~ +++ b/mods/pets/init.lua~ @@ -1,73 +1,100 @@ +pets = {} +pets.players_pets = {} + local function get_velocity(v, yaw, y) local x = -math.sin(yaw) * v local z = math.cos(yaw) * v return {x = x, y = y, z = z} end -minetest.register_entity("pets:pig", { +function pets.register_pet(name, def) + minetest.register_entity(name, { + hp_max = def.hp_max, + physical = true, + collisionbox = def.collisionbox, + visual = "mesh", + visual_size = {x=1, y=1}, + mesh = def.mesh, + textures = def.textures, + spritediv = {x=1, y=1}, + initial_sprite_basepos = {x=0, y=0}, + is_visible = true, + makes_footstep_sound = false, + automatic_rotate = true, + speed = 0, + pl = nil, + + on_rightclick = function(self, clicker) + if not clicker or not clicker:is_player() then + return + end + if pets.players_pets[clicker:get_player_name()] then + cmsg.push_message_player(clicker, "[pet] You already have a pet!") + else + pets.players_pets[clicker:get_player_name()] = name + cmsg.push_message_player(clicker, "[pet] + ".. def.description) + self.pl = clicker + end + end, + + on_step = function(self, dtime) + if self.pl ~= nil then + if self.pl:getpos() then + if vector.distance(self.object:getpos(), self.pl:getpos()) > 2 then + local vec = vector.direction(self.object:getpos(), self.pl:getpos()) + vec.y = vec.y * 10 + self.object:setvelocity(vector.multiply(vec, 3)) + local yaw = math.atan(vec.z/vec.x)+math.pi/2 + yaw = yaw+(math.pi/2) + if self.pl:getpos().x > self.object:getpos().x then + yaw = yaw+math.pi + end + self.object:setyaw(yaw) + end + if vector.distance(self.object:getpos(), self.pl:getpos()) > 15 then + local vec = self.pl:getpos() + vec.x = vec.x + math.random(-3, 3) + vec.z = vec.z + math.random(-3, 3) + vec.y = vec.y + 3 + self.object:setpos(vec) + end + end + else + if math.random(0, 50) == 15 then + local vec = {x=math.random(-3, 3), y=-4, z=math.random(-3, 3)} + self.object:setvelocity(vec) + local yaw = math.atan(vec.z/vec.x)+math.pi/2 + yaw = yaw+(math.pi/2) + if vec.x + self.object:getpos().x > self.object:getpos().x then + yaw = yaw+math.pi + end + self.object:setyaw(yaw) + end + end + end, + }) + + minetest.register_craftitem(name, { + description = def.description, + inventory_image = "pets_"..def.description.."_spawn.png", + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + minetest.add_entity(pointed_thing.above, name) + if not minetest.setting_getbool("creative_mode") then + itemstack:take_item() + end + return itemstack + end, + }) +end + +pets.register_pet("pets:pig", { + description = "pig", hp_max = 30, - physical = true, collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5}, - visual = "mesh", - visual_size = {x=1, y=1}, mesh = "pets_pig.x", textures = {"pets_pig.png",}, - spritediv = {x=1, y=1}, - initial_sprite_basepos = {x=0, y=0}, - is_visible = true, - makes_footstep_sound = false, - automatic_rotate = true, - speed = 0, - pl = nil, - - on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, direction) - if not puncher or not puncher:is_player() then - return - end - self.pl = puncher - cmsg.push_message_player(puncher, "[pet] pig") - end, - - on_step = function(self, dtime) - if self.pl ~= nil then - if vector.distance(self.object:getpos(), self.pl:getpos()) > 2 then - local vec = vector.direction(self.object:getpos(), self.pl:getpos()) - vec.y = vec.y * 10 - self.object:setvelocity(vector.multiply(vec, 3)) - local yaw = math.atan(vec.z/vec.x)+math.pi/2 - yaw = yaw+(math.pi/2) - if self.pl:getpos().x > self.object:getpos().x then - yaw = yaw+math.pi - end - self.object:setyaw(yaw) - end - else - if math.random(0, 50) == 15 then - local vec = {x=math.random(-3, 3), y=-4, z=math.random(-3, 3)} - self.object:setvelocity(vec) - local yaw = math.atan(vec.z/vec.x)+math.pi/2 - yaw = yaw+(math.pi/2) - if vec.x + self.object:getpos().x > self.object:getpos().x then - yaw = yaw+math.pi - end - self.object:setyaw(yaw) - end - end - end, -}) - -minetest.register_craftitem("pets:pig", { - description = "Pig", - inventory_image = "pets_pig_spawn.png", - - on_place = function(itemstack, placer, pointed_thing) - if pointed_thing.type ~= "node" then - return - end - minetest.add_entity(pointed_thing.above, "pets:pig") - if not minetest.setting_getbool("creative_mode") then - itemstack:take_item() - end - return itemstack - end, }) diff --git a/mods/pets/textures/pets_pig.png b/mods/pets/textures/pets_pig.png index f966b32..0a7c5bb 100644 Binary files a/mods/pets/textures/pets_pig.png and b/mods/pets/textures/pets_pig.png differ