X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=init.lua;h=60b76e3e287e1355e1c3c828483d50d27abf93c7;hb=HEAD;hp=1fa4271dab9d4d6cd3cf0de3142f5fbcbdef8f58;hpb=e85a77edab592901424375579bee008634a0fdc7;p=hangglider.git diff --git a/init.lua b/init.lua index 1fa4271..60b76e3 100644 --- a/init.lua +++ b/init.lua @@ -35,7 +35,7 @@ -- Reduced airbreak penalty severity -- gave glider limited durability. -- Improved gravity adjustment function. --- Changed airbreaking process +-- Changed airbreaking process -- Removed airbreak penalty, as any 'advantage' seems minimal after new adjustments -- Removed airbreak until minetest devs are smart enough to implement better serverside players. -- Simplified liquid check. @@ -77,7 +77,7 @@ minetest.register_entity("hangglider:airstopper", { --A one-instant entity that if player:is_player() then local pname = player:get_player_name() canExist = true - if player:get_player_velocity().y < 0.5 and player:get_player_velocity().y > -0.5 then + if player:get_player_velocity().y < 0.5 and player:get_player_velocity().y > -0.5 then --Let go when the player actually stops, as that's the whole point. if hangglider.use[pname] then if moveModelUp then @@ -99,7 +99,7 @@ minetest.register_entity("hangglider:airstopper", { --A one-instant entity that end })]] -if areas then +if core.global_exists("areas") then hangglider.flak = true -- chat command definition essentially copied from areas mod. minetest.register_chatcommand("area_flak",{ @@ -110,7 +110,7 @@ if areas then if not id then return false, "Invalid usage, see /help area_flak." end - + if not areas:isAreaOwner(id, name) then return false, "Area "..id.." does not exist" .." or is not owned by you." @@ -124,18 +124,23 @@ if areas then }) end -if minetestd and minetestd.services.gravityctl.enabled then -minetestd.gravityctl.register_gravity_effect("hangglider", - function(player) - return hangglider.use[player:get_player_name()] +if core.global_exists("minetestd") and minetestd.services.physicsctl.enabled then +minetestd.physicsctl.register_physics_effect("hangglider", + function(player) -- check + return hangglider.use[player:get_player_name()] end, - function(gravity, player) - local vel = player:get_player_velocity() - if debug then player:hud_change(hangglider.debug[pname].id, "text", vel.y..', '..player:get_physics_override().gravity..', '..tostring(hangglider.airbreak[pname])) end - return ((vel.y + 3)/20) + function(phys, player) -- blend + local vel_y = player:get_player_velocity().y + if debug then player:hud_change(hangglider.debug[pname].id, "text", vel_y..', '..player:get_physics_override().gravity..', '..tostring(hangglider.airbreak[pname])) end + phys.gravity = phys.gravity*((vel_y + 3)/20) + if vel_y < 0 and vel_y > -3 then + phys.speed = (math.abs(vel_y/2) + 0.75) + elseif vel_y <= -3 then --Cap our gliding movement speed. + phys.speed = 2.25 + end + phys.jump = 0 end, - 7, - 1000 + 7 -- effect order ) end @@ -147,8 +152,8 @@ hangglider.can_fly = function (pname, pos) return (minetest.check_player_privs(pname, {protection_bypass=true}) or wardzones.checkPlayerZoneAccess(pname, zone) or not zone["data"]["no_fly"]) end end - if areas and minetest.is_protected(vector.round(pos), pname) then - if hangglider.flak then + if areas and minetest.is_protected(vector.round(pos), pname) then + if hangglider.flak then for id, area in pairs(areas:getAreasAtPos(pos)) do if area.flak then return false @@ -161,35 +166,45 @@ end hangglider.shot_sound = function (pos) minetest.sound_play("hangglider_flak_shot", { - pos = pos, - max_hear_distance = 30, - gain = 10.0, + pos = pos, + max_hear_distance = 30, + gain = 10.0, }) end +local function set_fast(name, value) + local privs = minetest.get_player_privs(name) + privs.fast = value + minetest.set_player_privs(name, privs) +end + local physics_attrs = {"jump", "speed", "gravity"} local function apply_physics_override(player, overrides) - if player_monoids then - for _, attr in pairs(physics_attrs) do - if overrides[attr] then - player_monoids[attr]:add_change(player, overrides[attr], "hangglider:glider") - end - end - else - player:set_physics_override(overrides) - end + if player_monoids then + for _, attr in pairs(physics_attrs) do + if overrides[attr] then + player_monoids[attr]:add_change(player, overrides[attr], "hangglider:glider") + end + end + else + player:set_physics_override(overrides) + end + if minetest.settings:get_bool("hangglider_no_fast") then + set_fast(player:get_player_name(), nil) + end end local function remove_physics_override(player, overrides) - for _, attr in pairs(physics_attrs) do - if overrides[attr] then - if player_monoids then - player_monoids[attr]:del_change(player, "hangglider:glider") - else - player:set_physics_override({[attr] = 1}) - end - end - end + for _, attr in pairs(physics_attrs) do + if overrides[attr] then + if core.global_exists("player_monoids") then + player_monoids[attr]:del_change(player, "hangglider:glider") + else + player:set_physics_override({[attr] = 1}) + end + end + end + set_fast(player:get_player_name(), true) end local step_v @@ -213,46 +228,47 @@ minetest.register_entity("hangglider:glider", { if mrn_name then if not (mrn_name.walkable or mrn_name.liquidtype ~= "none") then canExist = true - step_v = player:get_player_velocity().y - if step_v < 0 and step_v > -3 then - apply_physics_override(player, {speed=math.abs(step_v/2) + 0.75}) - elseif step_v <= -3 then --Cap our gliding movement speed. - apply_physics_override(player, {speed=2.25}) - else - remove_physics_override(player, {speed=1}) - end + if not minetestd then + step_v = player:get_player_velocity().y + if step_v < 0 and step_v > -3 then + apply_physics_override(player, {speed=math.abs(step_v/2) + 0.75}) + elseif step_v <= -3 then --Cap our gliding movement speed. + apply_physics_override(player, {speed=2.25}) + else + remove_physics_override(player, {speed=1}) + end if debug then player:hud_change(hangglider.debug[pname].id, "text", step_v..', '..player:get_physics_override().gravity..', '..tostring(hangglider.airbreak[pname])) end apply_physics_override(player, {gravity=((step_v + 3)/20)}) end --[[local vel = player:get_player_velocity() if debug then player:hud_change(hangglider.debug[pname].id, "text", vel.y..', '..grav..', '..tostring(hangglider.airbreak[pname])) end - + player:set_physics_override({gravity = (vel.y + 2.0)/20}) ]]end end end if not hangglider.can_fly(pname,pos) then - if not self.warned then -- warning shot + if not self.warned then -- warning shot self.warned = 0 hangglider.shot_sound(pos) minetest.chat_send_player(pname, "Protected area! You will be shot down in two seconds by anti-aircraft guns!") - end - self.warned = self.warned + dtime - if self.warned > 2 then -- shoot down + end + self.warned = self.warned + dtime + if self.warned > 2 then -- shoot down player:set_hp(1) player:get_inventory():remove_item("main", ItemStack("hangglider:hangglider")) hangglider.shot_sound(pos) canExist = false - end + end end if not canExist then - remove_physics_override(player, { - jump = 1, - speed = 1, - }) + if not minetestd then - remove_physics_override(player, {gravity=1}) + remove_physics_override(player, { + gravity=1, + jump = 1, + speed = 1,}) end hangglider.use[pname] = false if HUD_Overlay then @@ -262,9 +278,9 @@ minetest.register_entity("hangglider:glider", { end end end - if not canExist then + if not canExist then self.object:set_detach() - self.object:remove() + self.object:remove() end end }) @@ -294,7 +310,7 @@ minetest.register_on_joinplayer(function(player) alignment = {x=1, y=1}, offset = {x=0, y=0} }) end - if debug then + if debug then hangglider.debug[pname] = {id = player:hud_add({hud_elem_type = "text", position = {x=0.5, y=0.1}, text = "-", @@ -338,7 +354,7 @@ minetest.register_tool("hangglider:hangglider", { player:set_attach( stopper, "", {x=0,y=0,z=0}, {x=0,y=0,z=0}) end, stopper, player) end]] - if not airbreak then + if not airbreak then if moveModelUp then minetest.add_entity(pos, "hangglider:glider"):set_attach(player, "", {x=0,y=10,z=0}, {x=0,y=0,z=0}) else @@ -348,7 +364,7 @@ minetest.register_tool("hangglider:hangglider", { hangglider.use[pname] = true apply_physics_override(player, {jump = 0}) -- if minetest 0.4.x use this: - + -- if minetest 5.x use this: -- minetest.add_entity(player:get_pos(), "hangglider:glider"):set_attach(player, "", {x=0,y=10,z=0}, {x=0,y=0,z=0}) itemstack:set_wear(itemstack:get_wear() + 255)