parkoursurvive/init.lua

330 lines
11 KiB
Lua
Raw Normal View History

2018-11-21 13:19:48 -08:00
parkoursurvive={
step_timer=0,
step_time=0.5,
2018-11-24 09:59:17 -08:00
player={},
2018-11-24 12:00:45 -08:00
playeranim={
stand={x=1,y=39,speed=30},
walk={x=41,y=61,speed=30},
mine={x=65,y=75,speed=30},
hugwalk={x=80,y=99,speed=30},
lay={x=113,y=123,speed=0},
sit={x=101,y=111,speed=0},
},
2018-11-21 13:19:48 -08:00
}
2018-11-24 12:00:45 -08:00
parkoursurvive.player_anim=function(self,typ)
if typ==self.anim then
return
end
self.anim=typ
self.object:set_animation({x=parkoursurvive.playeranim[typ].x, y=parkoursurvive.playeranim[typ].y, },parkoursurvive.playeranim[typ].speed,0)
return self
end
2018-11-24 09:59:17 -08:00
minetest.register_on_joinplayer(function(player)
local name=player:get_player_name()
parkoursurvive.player[name]={
power=100,
bar_back=player:hud_add({
hud_elem_type="statbar",
position={x=1,y=0},
text="parkoursurvive_bar2.png",
number=0,
size={x=5,y=20},
direction=1,
}),
bar=player:hud_add({
hud_elem_type="statbar",
position={x=1,y=0},
text="parkoursurvive_bar.png",
number=0,
size={x=5,y=20},
direction=1,
})
}
end)
parkoursurvive.power=function(player,add)
local a=parkoursurvive.player[player:get_player_name()]
2018-11-24 10:33:25 -08:00
if not a or (a.power>=100 and add>0) then
2018-11-24 09:59:17 -08:00
return
elseif a.power+add<-10 then
a.power=-10
else
a.power=a.power+add
end
if a.power>=100 then
2018-11-24 10:33:25 -08:00
a.power=100
2018-11-24 09:59:17 -08:00
player:hud_change(a.bar, "number", 0)
player:hud_change(a.bar_back, "number", 0)
else
player:hud_change(a.bar, "number", a.power)
2018-11-24 10:33:25 -08:00
player:hud_change(a.bar_back, "number", 100)
2018-11-24 09:59:17 -08:00
end
end
minetest.register_on_respawnplayer(function(player)
2018-11-28 10:12:01 -08:00
parkoursurvive.player[player:get_player_name()].power=100
2018-11-24 09:59:17 -08:00
end)
minetest.register_on_leaveplayer(function(player)
parkoursurvive.player[player:get_player_name()]=nil
end)
2018-11-21 13:19:48 -08:00
minetest.register_globalstep(function(dtime)
if parkoursurvive.step_timer>parkoursurvive.step_time then
parkoursurvive.step_timer=0
else
parkoursurvive.step_timer=parkoursurvive.step_timer+dtime
return
end
for _,player in ipairs(minetest.get_connected_players()) do
2018-11-24 09:59:17 -08:00
if not player:get_attach() and player:get_hp()>0 and player:get_player_control().RMB and player:get_wielded_item():get_name()=="" and parkoursurvive.player[player:get_player_name()].power>10 then
2018-11-22 09:04:12 -08:00
2018-11-21 13:19:48 -08:00
local pos=player:get_pos()
local node=minetest.registered_nodes[minetest.get_node(pos).name]
if node and (node.liquid_viscosity==0 and not node.climbable and node.damage_per_second==0) then
2018-11-24 12:00:45 -08:00
local e=minetest.add_entity({x=pos.x,y=pos.y+1,z=pos.z}, "parkoursurvive:player")
local p=parkoursurvive.player[player:get_player_name()]
p.textures=player:get_properties().textures
2018-11-21 13:19:48 -08:00
e:get_luaentity().user=player
e:set_velocity(player:get_player_velocity())
2018-11-24 12:00:45 -08:00
e:set_properties({textures=p.textures})
e:set_yaw(player:get_look_yaw()-math.pi/2)
player:set_attach(e,"",{x=0,y=10,z=0},{x=0,y=0,z=0})
2018-11-24 10:33:25 -08:00
player:hud_change(p.bar_back, "number", 100)
player:hud_change(p.bar, "number", p.power)
2018-11-24 12:00:45 -08:00
player:set_properties({textures={"parkoursurvive_t.png","parkoursurvive_t.png","parkoursurvive_t.png","parkoursurvive_t.png","parkoursurvive_t.png","parkoursurvive_t.png"}})
player:set_eye_offset({x=0,y=-10,z=1},{x=0,y=0,z=0})
2018-11-21 13:19:48 -08:00
end
2018-11-24 09:59:17 -08:00
else
parkoursurvive.power(player,2)
2018-11-21 13:19:48 -08:00
end
end
end)
minetest.register_entity("parkoursurvive:player",{
2018-11-24 12:00:45 -08:00
hp_max = 10000,
2018-11-21 13:19:48 -08:00
physical = true,
2018-11-24 12:00:45 -08:00
collisionbox = {-0.35,-1.0,-0.35,0.35,0.8,0.35},
visual = "mesh",
mesh="parkoursurvive_character.b3d",
2018-11-21 13:19:48 -08:00
makes_footstep_sound = true,
2018-11-24 12:00:45 -08:00
-- pointable = false, makes players can cheat in pvp
2018-11-21 13:19:48 -08:00
on_punch=function(self, puncher, time_from_last_punch, tool_capabilities)
2018-11-22 09:04:12 -08:00
if not (puncher:is_player() and puncher:get_player_name()==self.user:get_player_name()) and tool_capabilities and tool_capabilities.damage_groups and tool_capabilities.damage_groups.fleshy then
2018-11-23 07:14:17 -08:00
local hp=self.user:get_hp()-tool_capabilities.damage_groups.fleshy
if hp<1 then
self.exit(self,{},self.object:get_pos())
end
self.user:set_hp(hp)
2018-11-21 13:19:48 -08:00
end
return self
end,
on_activate=function(self, staticdata)
2018-11-24 10:33:25 -08:00
minetest.after(0, function(self)
2018-11-24 09:59:17 -08:00
if not (self.user and self.user:get_pos()) then
2018-11-21 13:19:48 -08:00
self.object:remove()
2018-11-24 09:59:17 -08:00
return
2018-11-21 13:19:48 -08:00
end
2018-11-24 09:59:17 -08:00
self.username=self.user:get_player_name()
2018-11-21 13:19:48 -08:00
end, self)
return self
end,
2018-11-24 09:59:17 -08:00
exit=function(self,key,pos,power)
2018-11-23 07:14:17 -08:00
local node=self.node(pos)
2018-12-21 11:26:52 -08:00
if not power or power<0 or not self.v or (not key.RMB and not key.jump and math.abs(self.speed)<0.5) or self.user:get_hp()<=0 or node.liquid_viscosity>0 or node.climbable or node.damage_per_second>0 then
2018-11-24 12:00:45 -08:00
if self.user and self.user:get_pos() then
self.user:set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0})
self.user:set_properties({textures=parkoursurvive.player[self.username].textures})
2018-11-24 10:33:25 -08:00
parkoursurvive.power(self.user,0)
2018-11-23 07:14:17 -08:00
self.falling(self,pos)
self.user:set_detach()
end
self.object:remove()
return
end
end,
2018-11-22 09:04:12 -08:00
falling=function(self,pos)
if self.v.y<0 and not self.fallingfrom then
self.fallingfrom=pos.y
elseif self.fallingfrom and self.v.y==0 then
local from=math.floor(self.fallingfrom+0.5)
local hit=math.floor(pos.y+0.5)
local d=from-hit
self.fallingfrom=nil
if minetest.get_node({x=pos.x,y=pos.y-2,z=pos.z}).name~="ignore" and d>=10 then
self.on_punch(self, self.object, 1, {damage_groups={fleshy=d}})
end
end
end,
node=function(pos)
2018-11-24 12:00:45 -08:00
pos={x=pos.x,y=pos.y-0.5,z=pos.z}
2018-11-22 09:04:12 -08:00
return minetest.registered_nodes[minetest.get_node(pos).name] or minetest.registered_nodes["air"]
end,
walls=function(self,pos,key)
local p={x=0,y=0,z=0}
local a={x=0,y=-20,z=0}
local yaw=self.object:get_yaw()
if yaw ~= yaw or type(yaw)~="number" then
return
end
p.x=math.sin(yaw)*-1
p.z=math.cos(yaw)*1
local f={x=pos.x+p.x,y=pos.y,z=pos.z+p.z}
local b={x=pos.x-p.x,y=pos.y,z=pos.z-p.z}
local r={x=pos.x+(math.sin(yaw-1.5)*-1),y=pos.y,z=pos.z+math.cos(yaw-1.5)}
local l={x=pos.x+(math.sin(yaw+1.5)*-1),y=pos.y,z=pos.z+math.cos(yaw+1.5)}
2018-11-23 07:14:17 -08:00
if key.RMB and math.abs(self.v.y)<20 and self.node({x=pos.x,y=pos.y-1,z=pos.z}).walkable==false and not self.node({x=pos.x,y=pos.y+2,z=pos.z}).walkable and
2018-11-22 09:04:12 -08:00
((self.node(f).walkable and self.node({x=f.x,y=f.y+1,z=f.z}).walkable==false)
or (self.node({x=f.x,y=f.y+1,z=f.z}).walkable and self.node({x=f.x,y=f.y+2,z=f.z}).walkable==false)
or (self.node({x=f.x,y=f.y+2,z=f.z}).walkable and self.node({x=f.x,y=f.y+3,z=f.z}).walkable==false)) then
2018-11-22 13:35:45 -08:00
--wall climb/catleap
2018-11-22 09:04:12 -08:00
a.y=0
if key.jump then
self.v.y=5
self.speed=2
2018-11-24 09:59:17 -08:00
parkoursurvive.power(self.user,-1)
2018-11-22 09:04:12 -08:00
elseif key.down then
self.v.y=7
self.speed=-10
parkoursurvive.power(self.user,-3)
2018-11-22 09:04:12 -08:00
else
self.v.y=0
self.speed=0
2018-11-24 09:59:17 -08:00
parkoursurvive.power(self.user,-0.2)
2018-11-22 09:04:12 -08:00
end
2018-11-23 07:14:17 -08:00
self.tic=nil
2018-11-22 13:35:45 -08:00
elseif key.left and self.node(r).walkable and self.node({x=pos.x,y=pos.y-1,z=pos.z}).walkable==false then
--tic tac left
2018-11-23 07:14:17 -08:00
if self.v.y>-5 then
self.v.y=5
end
self.tic=true
self.object:set_velocity({x=math.sin(yaw+1.5)*-10,y=self.v.y,z=math.cos(yaw+1.5)*10})
2018-11-24 09:59:17 -08:00
parkoursurvive.power(self.user,-0.5)
2018-11-22 13:35:45 -08:00
return true
elseif key.right and self.node(l).walkable and self.node({x=pos.x,y=pos.y-1,z=pos.z}).walkable==false then
--tic tac right
2018-11-23 07:14:17 -08:00
if self.v.y>-5 then
self.v.y=5
end
self.tic=true
self.object:set_velocity({x=math.sin(yaw-1.5)*-10,y=self.v.y,z=math.cos(yaw-1.5)*10})
2018-11-24 09:59:17 -08:00
parkoursurvive.power(self.user,-0.5)
2018-11-22 13:35:45 -08:00
return true
elseif self.tic then
2018-11-23 07:14:17 -08:00
if not (key.left or key.right) or self.node({x=pos.x,y=pos.y-1,z=pos.z}).walkable then --self.v.y<-5 then --
2018-11-22 13:35:45 -08:00
self.tic=nil
else
2018-11-23 07:14:17 -08:00
self.object:set_acceleration(a)
2018-11-22 13:35:45 -08:00
return true
end
elseif key.up and self.v.y==0 and self.speed>5 and self.node(f).walkable and self.node({x=f.x,y=f.y+1,z=f.z}).walkable then
2018-11-22 09:04:12 -08:00
--wallrun
if self.node({x=f.x,y=f.y+2,z=f.z}).walkable then
self.v.y=self.speed*1.2
2018-11-24 09:59:17 -08:00
parkoursurvive.power(self.user,-3)
else
parkoursurvive.power(self.user,-2)
2018-11-22 09:04:12 -08:00
self.v.y=self.speed
end
self.speed=1
elseif key.up and key.LMB and self.v.y>-10 and self.speed>5 and self.node(f).walkable==false and self.node({x=f.x,y=f.y+1,z=f.z}).walkable and self.node({x=f.x,y=f.y-1,z=f.z}).walkable==false then
--"under bar"
parkoursurvive.power(self.user,-1)
self.object:set_pos({x=pos.x,y=pos.y-1,z=pos.z})
elseif key.up and key.LMB and self.v.y>-10 and self.speed>9 and self.speed<15 and self.node(f).walkable then
2018-11-22 09:04:12 -08:00
--kong
parkoursurvive.power(self.user,-5)
2018-11-23 07:14:17 -08:00
self.v.y=7
self.speed=10
2018-11-22 09:04:12 -08:00
self.object:set_pos({x=pos.x,y=pos.y+1,z=pos.z})
elseif key.up and key.RMB and self.v.y==0 and self.node(f).walkable and self.node({x=pos.x,y=pos.y-1,z=pos.z}).walkable then
--vault
parkoursurvive.power(self.user,-1)
self.v.y=7
elseif key.up and self.v.y==0 and self.speed<2 and self.node(f).walkable and self.node({x=pos.x,y=pos.y-1,z=pos.z}).walkable then
--hit a wall
self.speed=self.speed*0.9
2018-11-22 09:04:12 -08:00
end
self.object:set_acceleration(a)
end,
2018-11-21 13:19:48 -08:00
on_step=function(self, dtime)
if self.start>0 then
self.start=self.start-dtime
return
elseif not (self.user and self.user:get_attach()) then
self.object:remove()
return
end
local key=self.user:get_player_control()
2018-11-24 09:59:17 -08:00
local power=parkoursurvive.player[self.username].power
if power<=0 then
key={}
end
2018-11-21 13:19:48 -08:00
local pos=self.object:get_pos()
2018-11-22 09:04:12 -08:00
self.v=self.object:get_velocity()
2018-11-24 09:59:17 -08:00
self.exit(self,key,pos,power)
2018-11-21 13:19:48 -08:00
self.object:set_yaw(self.user:get_look_yaw()-math.pi/2)
2018-11-22 09:04:12 -08:00
--exit
self.falling(self,pos)
2018-11-21 13:19:48 -08:00
2018-11-22 09:04:12 -08:00
if self.walls(self,pos,key) then return end
2018-11-23 07:14:17 -08:00
2018-11-22 09:04:12 -08:00
--control & speed
2018-11-23 07:14:17 -08:00
if key.jump and self.v.y==0 and not self.fallingfrom then
2018-11-22 09:04:12 -08:00
--precision jump
if self.speed==0 then
self.v.y=7
self.speed=14
parkoursurvive.power(self.user,-3)
2018-11-23 07:14:17 -08:00
elseif not self.node({x=pos.x,y=pos.y+2,z=pos.z}).walkable then
2018-11-22 09:04:12 -08:00
self.v.y=self.speed
parkoursurvive.power(self.user,-2)
2018-11-21 13:19:48 -08:00
end
2018-11-22 13:35:45 -08:00
--run
2018-11-22 09:04:12 -08:00
elseif key.up and self.speed>=0 and self.speed<10 then
if self.speed<1 then
2018-11-24 09:59:17 -08:00
self.speed=4
2018-11-22 09:04:12 -08:00
end
parkoursurvive.power(self.user,-0.3)
2018-11-22 09:04:12 -08:00
self.speed=self.speed*1.05
elseif not self.fallingfrom then
if math.abs(self.speed)<0.5 then
self.v.x=0
self.v.z=0
self.speed=0
end
self.speed=self.speed*0.9
self.v.x=self.v.x*self.speed
self.v.z=self.v.z*self.speed
2018-11-24 09:59:17 -08:00
else
self.object:set_acceleration({x=0,y=-20,z=0})
2018-11-21 13:19:48 -08:00
end
2018-11-24 12:00:45 -08:00
if math.abs(self.speed)>0 then
parkoursurvive.player_anim(self,"walk")
2018-11-21 13:19:48 -08:00
local yaw=self.object:get_yaw()
if yaw ~= yaw or type(yaw)~="number" then
return
end
2018-11-22 09:04:12 -08:00
self.v.x=math.sin(yaw)*-self.speed
self.v.z=math.cos(yaw)*self.speed
2018-11-24 12:00:45 -08:00
else
parkoursurvive.player_anim(self,"stand")
2018-11-21 13:19:48 -08:00
end
2018-11-22 09:04:12 -08:00
self.object:set_velocity(self.v)
2018-11-21 13:19:48 -08:00
end,
2018-11-23 07:14:17 -08:00
speed=0,
2018-11-21 13:19:48 -08:00
type="npc",
start=0.15,
})