From 53716b3a2d4b98f33ec5098f41f39528724b6cbd Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sun, 23 Jul 2017 17:25:33 -0400 Subject: [PATCH] Basic item magnet --- entity.lua | 123 +++++++++++++++++++++++++++++++++++--------------- inventory.lua | 4 +- player.lua | 4 ++ 3 files changed, 92 insertions(+), 39 deletions(-) diff --git a/entity.lua b/entity.lua index a7cb794..60383ea 100644 --- a/entity.lua +++ b/entity.lua @@ -28,6 +28,7 @@ function entity.create_entity(type,sizex,sizey,texture,chunkx,chunky,posx,posy,i if item then entity_table[entity_count]["texture"] = texture_table[item] + entity_table[entity_count]["magnetized"] = false else entity_table[entity_count]["texture"] = texture end @@ -38,12 +39,15 @@ end --draw entities function entity.render_entity() - if entity_count > 0 then - for i = 1,entity_count do - local drawx = (player_drawnx+(entity_table[i]["posx"]*scale)+(map_max*scale*(entity_table[i]["chunkx"]-chunkx))-(player.playerx*scale))-((entity_table[i]["sizex"]/2)*scale) - local drawy = (player_drawny+(entity_table[i]["posy"]*scale)+(map_max*scale*(chunky-entity_table[i]["chunky"]))-(player.playery*scale))-((entity_table[i]["sizey"]/2)*scale) - love.graphics.draw(entity_table[i]["texture"], drawx,drawy,0, scale*entity_table[i]["sizex"]/21, scale*entity_table[i]["sizey"]/21)--,scale*(entity_table[i]["sizex"]),scale*(entity_table[i]["sizey"])) - --love.graphics.circle( "fill", drawx+((entity_table[i]["sizex"]/2)*scale), drawy+((entity_table[i]["sizey"]/2)*scale), 3 ) + if table.getn(entity_table) > 0 then + for i = 1,table.getn(entity_table) do + --print(i,entity_table[i]) + if entity_table[i] then + local drawx = (player_drawnx+(entity_table[i]["posx"]*scale)+(map_max*scale*(entity_table[i]["chunkx"]-chunkx))-(player.playerx*scale))-((entity_table[i]["sizex"]/2)*scale) + local drawy = (player_drawny+(entity_table[i]["posy"]*scale)+(map_max*scale*(chunky-entity_table[i]["chunky"]))-(player.playery*scale))-((entity_table[i]["sizey"]/2)*scale) + love.graphics.draw(entity_table[i]["texture"], drawx,drawy,0, scale*entity_table[i]["sizex"]/21, scale*entity_table[i]["sizey"]/21)--,scale*(entity_table[i]["sizex"]),scale*(entity_table[i]["sizey"])) + --love.graphics.circle( "fill", drawx+((entity_table[i]["sizex"]/2)*scale), drawy+((entity_table[i]["sizey"]/2)*scale), 3 ) + end end end end @@ -51,25 +55,29 @@ end --entity gravity function entity.gravity() - if entity_count > 0 then - for i = 1,entity_count do - if entity_table[i]["entity_in_unloaded_chunk"] == false then - --print(entity_table[i]["on_block"]) - if entity_table[i]["on_block"] == true then - entity_table[i]["inertiay"] = 0 - --lastheight = math.floor(((map_max-player.playery)+(chunky*map_max))) - --print(lastheight) - --player.on_block = false - else - if entity_table[i]["inertiay"] < 0.3 then - entity_table[i]["inertiay"] = entity_table[i]["inertiay"] + 0.01 - --print(entity_table[i]["inertiay"]) + if table.getn(entity_table) > 0 then + for i = 1,table.getn(entity_table) do + if entity_table[i] then + if entity_table[i]["magnetized"] == false then + if entity_table[i]["entity_in_unloaded_chunk"] == false then + --print(entity_table[i]["on_block"]) + if entity_table[i]["on_block"] == true then + entity_table[i]["inertiay"] = 0 + --lastheight = math.floor(((map_max-player.playery)+(chunky*map_max))) + --print(lastheight) + --player.on_block = false + else + if entity_table[i]["inertiay"] < 0.3 then + entity_table[i]["inertiay"] = entity_table[i]["inertiay"] + 0.01 + --print(entity_table[i]["inertiay"]) + end + end + else + --print("entity "..i.." in unloaded chunk") + entity_table[i]["inertiax"] = 0 + entity_table[i]["inertiay"] = 0 end end - else - --print("entity "..i.." in unloaded chunk") - entity_table[i]["inertiax"] = 0 - entity_table[i]["inertiay"] = 0 end end end @@ -80,24 +88,29 @@ function entity.physics_apply(dt) --local oldposx,oldposy = player.playerx,player.playery - if entity_count > 0 then - for i = 1,entity_count do + if table.getn(entity_table) > 0 then + for i = 1,table.getn(entity_table) do - entity.collision(i,entity_table[i].posx,entity_table[i].posy) + if entity_table[i] then - entity.new_chunk(i,entity_table[i].posx,entity_table[i].posy) + entity.collision(i,entity_table[i].posx,entity_table[i].posy) - --collisionx(oldposx) - --print(entity_table[i].inertiax) - if math.abs(entity_table[i].inertiax) <= 0.005 then - entity_table[i].inertiax = 0 - elseif entity_table[i].inertiax < 0 then - entity_table[i].inertiax = entity_table[i].inertiax + 0.005 - elseif entity_table[i].inertiax > 0 then - entity_table[i].inertiax = entity_table[i].inertiax - 0.005 - else - entity_table[i].inertiax = entity_table[i].inertiax + entity.new_chunk(i,entity_table[i].posx,entity_table[i].posy) + + --collisionx(oldposx) + --print(entity_table[i].inertiax) + if math.abs(entity_table[i].inertiax) <= 0.005 then + entity_table[i].inertiax = 0 + elseif entity_table[i].inertiax < 0 then + entity_table[i].inertiax = entity_table[i].inertiax + 0.005 + elseif entity_table[i].inertiax > 0 then + entity_table[i].inertiax = entity_table[i].inertiax - 0.005 + else + entity_table[i].inertiax = entity_table[i].inertiax + end + + entity.item_magnet(i) end end end @@ -266,3 +279,39 @@ function entity.new_chunk(i,posx,posy) return true end + + +--magnetize items towards player +--taken from sfan5's nuke mod in Minetest - https://forum.minetest.net/viewtopic.php?id=638 +function entity.item_magnet(i) + local realx = player.playerx - entity_table[i]["posx"] + local realy = player.playery - entity_table[i]["posy"] + local x = realx--math.abs(realx) + local y = realy--math.abs(realy) + + local calc1 = x*x+y*y --optimize + + entity_table[i]["magnetized"] = false + + if calc1 <= magnet_radius * magnet_radius + magnet_radius then + if realx > 0 then + entity_table[i]["inertiax"] = entity_table[i]["inertiax"] + 0.02 + elseif realx < 0 then + entity_table[i]["inertiax"] = entity_table[i]["inertiax"] - 0.02 + end + + if realy > 0 then + entity_table[i]["inertiay"] = entity_table[i]["inertiay"] + 0.02 + elseif realy < 0 then + entity_table[i]["inertiay"] = entity_table[i]["inertiay"] - 0.02 + end + entity_table[i]["magnetized"] = true + end + if calc1 <= add_inventory_radius * add_inventory_radius + add_inventory_radius then + inventory_add(entity_table[i]["item"]) + --entity_table[i] = nil + table.remove(entity_table,i) + entity_count = entity_count - 1 + print("add to inventory") + end +end diff --git a/inventory.lua b/inventory.lua index b629c18..3e1561c 100644 --- a/inventory.lua +++ b/inventory.lua @@ -107,9 +107,9 @@ function render_inventory() end - +--throw item function throw_item() - print(inventory[inventory_selection]["id"]) + --print(inventory[inventory_selection]["id"]) if inventory[inventory_selection]["id"] ~= nil then --do it in this order to avoid nil entity.create_entity("item",0.4,0.4,nil,chunkx,chunky,player.playerx,player.playery+0.5,math.random(-300,300)/1000,math.random(-150,-240)/1000,inventory[inventory_selection]["id"]) diff --git a/player.lua b/player.lua index 5bd1c78..9456e22 100644 --- a/player.lua +++ b/player.lua @@ -14,6 +14,10 @@ health = 10 deaths = 0 +magnet_radius = 5 + +add_inventory_radius = 0.5 + function move(dt) --debug - stresstest --if love.keyboard.isDown("f5") then