From 42b7f9876ac4acbd9eba8f37f80d27a191a1fc57 Mon Sep 17 00:00:00 2001 From: cale Date: Sat, 16 Jan 2016 11:50:15 +0100 Subject: [PATCH] fixed cmsg bug + code cleanup --- mods/central_message/init.lua | 9 ++ mods/central_message/init.lua~ | 123 ++++++++++++++++++++++++++ mods/pets/init.lua | 151 +++++++++++++++++++------------- mods/pets/init.lua~ | 151 +++++++++++++++++++------------- mods/pets/textures/pets_pig.png | Bin 906 -> 1089 bytes 5 files changed, 310 insertions(+), 124 deletions(-) create mode 100644 mods/central_message/init.lua~ 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 f966b3244d68a45363caf52b76c6eaf11e98acf7..0a7c5bb39b588a82e4224faf38784a0ddd12f8f2 100644 GIT binary patch delta 1039 zcmV+q1n~Qc2f+xCL4Obl3nXXH$(R5D1K>$SK~zY`U6w&|Bt;BG-&a+)XNVwRN3bS> zE3xAwT!5RvF*wK^V3rUJ;Et5uit-T{Mc9q*?{YxU>lTg zd};0Dw#`TNY3DcV@(I{6qxU+bf1bytI&J4!eK}8Tq<7KlC4UKUeb${|#J*AxM!>hX zz196I$~W6)jaaUPZIEU(R1W|nW2~rTgsghxQ8ECxkn?(Lp)r4tUx;V#^R9_eB-}#1 zl9ol@mGB(B|MBVbJz`e=wY3jhD7$jO=@wx)-LdVuDH6MG3mF^ZfdRUQfM0(4VRRed z!xmr9p4Shs7Js0-gz~F^uE^=uRmCeRi0=zW*^C|{1pVlFOrV+O>p7B3Qh<p?7uI_Cz0x#4{?8r?84V z$(9Ns2HZ|AW}wwH$r;cWT^rEOY4G*9!D+aR>`tNM!joKDTRBAe0P2Mt==pHN@HaPpQ z;;SmHvf`m_(6hI7mDv@$WO>B!B*7|W)Na#Fa3N-D=e708?R!Kr_;7#cB@K6~bJwn3 zT+4#+(2JFH_Dh7}(fbvyJtdY*^TbS9?$zQY;(uZ%`!i(tlnl~jO;Rbwcq?nUE5^_V`KB5rNOo0e~AZ5Bx6nU^Tf(A!bl zGJm48*c{vCHrMrmu~U?3YE9F9tv5L{bu~$Elo@!NW2*enPBU+Z()fwi>_<&>)A2?1NDB%;i+)wumAu600>D% JPDHLkV1ife3y1&! delta 854 zcmV-c1F8JM2#N=gL4OYo2o{S*B+dW;11U*FK~zY`U6##pB}EW~Gh4F)4+zdg;1V}1 z!2vu0GcaTgSPz6)&BvjBM>;&cH`85Rm6?^*{^!p>RDU3hWROHYlmN-G0t?iy@-rSG zygntt>7{pmGf?jZu{Wd3{uI5ROCmq>ObJ=nq+k(&B*}<6C4WT zy?@-2e*g97w~t$PH^oF%ueSo}Dug6Cq>(kcaj7otp6KkEQ+^NbaEo(wdN zRqSa&VHMoPQfAUW9U@9Phk0LW!f$0O6$}F&CIK2M8-JiW%tPX`lWQZ{%$tKU!>YP4r$%fMRJ`fI;+%TbSXtgQj zblTx8cQ@?*Z@5NcTCQN-m1C-a;os7Q$3NOh%c4DubUeXEnS4S~#H5hk@UOFunUe_Z5$j&5tdgf zr4%R&Aco_0_w?G}csh9ktznvRvhd=^!A83Xa?FFsx(ua;zGBFc<72yWE-zm(k7?0V zTSTL6*IF?5mdVRu$c-UeO9QsbQKsd{u>Tp`AJA~S0I)umM zJgVc-r&nIf(4AIW-Q?AD%YJ8^!aAGn6R|zETvK}A9{2t}U!Nqnvo1}}xEoNf#i5I# zMNdYnR$km|ds+^|@l4lElu{83x`$mmFO^H`_GYCorK`D=_t&S29`36(MfSC(O}Hmu g$e&rfuEp`}e;}=C3+!1eL;wH)07*qoM6N<$f(HSqT>t<8