mirror of
https://github.com/IntQuant/noita_entangled_worlds.git
synced 2025-10-19 07:03:16 +00:00
fix teleportitis dodge reacting to team mates projectiles
This commit is contained in:
parent
f2348969a8
commit
ba8801db87
1 changed files with 79 additions and 0 deletions
79
quant.ew/data/scripts/perks/teleportitis_dodge.lua
Normal file
79
quant.ew/data/scripts/perks/teleportitis_dodge.lua
Normal file
|
@ -0,0 +1,79 @@
|
|||
dofile_once("data/scripts/lib/utilities.lua")
|
||||
|
||||
local sensor_range = 20
|
||||
local teleport_range = 90
|
||||
local time_active = 1
|
||||
local time_cooldown = 130
|
||||
|
||||
local entity_id = GetUpdatedEntityID()
|
||||
local root_id = EntityGetRootEntity(entity_id)
|
||||
local pos_x, pos_y = EntityGetTransform( entity_id )
|
||||
|
||||
local function teleport(from_x, from_y, to_x, to_y)
|
||||
EntitySetTransform(root_id, to_x, to_y)
|
||||
EntityLoad("data/entities/particles/teleportation_source.xml", from_x, from_y)
|
||||
EntityLoad("data/entities/particles/teleportation_target.xml", to_x, to_y)
|
||||
GamePlaySound("data/audio/Desktop/misc.bank","misc/teleport_use", to_x, to_y)
|
||||
|
||||
-- punch a hole to make sure player doesn't get stuck
|
||||
LoadPixelScene("data/biome_impl/teleportitis_dodge_hole.png", "", to_x-3, to_y-12, "", true)
|
||||
end
|
||||
|
||||
-- toggles vfx and sets script exec time
|
||||
local function set_cooldown(on_cooldown, frames)
|
||||
EntitySetComponentsWithTagEnabled(entity_id, "teleportitis_dodge_vfx", not on_cooldown)
|
||||
component_write( GetUpdatedComponentID(), {
|
||||
execute_every_n_frame = frames,
|
||||
mNextExecutionTime = GameGetFrameNum() + frames,
|
||||
})
|
||||
end
|
||||
|
||||
local genome = EntityGetFirstComponentIncludingDisabled(entity_id, "GenomeDataComponent")
|
||||
local my_herd
|
||||
if genome ~= nil then
|
||||
my_herd = ComponentGetValue(genome, "herd_id")
|
||||
end
|
||||
|
||||
|
||||
-- look for enemy projectiles
|
||||
for _,proj_id in ipairs(EntityGetInRadiusWithTag( pos_x, pos_y, sensor_range, "projectile" )) do
|
||||
local comp_proj = EntityGetFirstComponent(proj_id, "ProjectileComponent")
|
||||
if comp_proj ~= nil then
|
||||
local shooter_id = tonumber(ComponentGetValue(comp_proj, "mWhoShot"))
|
||||
local herd_id = tonumber(ComponentGetValue(comp_proj, "mShooterHerdId") or -1)
|
||||
if shooter_id ~= 0 and shooter_id ~= root_id and herd_id ~= my_herd then
|
||||
-- found. let's prep for teleport
|
||||
local x = 0
|
||||
local y = 0
|
||||
|
||||
-- teleport direction from player aim
|
||||
local aim_comp = EntityGetFirstComponent(root_id, "SpriteComponent", "aiming_reticle")
|
||||
component_read( aim_comp, { offset_x = 0, offset_y = 0 }, function(comp)
|
||||
x = comp.offset_x
|
||||
y = comp.offset_y - 4
|
||||
x, y = vec_normalize(x, y)
|
||||
x, y = vec_mult(x, y, teleport_range)
|
||||
x, y = vec_rotate(x, y, -math.pi * 0.5 * sign(x)) -- rotate 90 towards top
|
||||
local did_hit
|
||||
did_hit,x,y = RaytracePlatforms(pos_x, pos_y, pos_x + x, pos_y + y)
|
||||
end)
|
||||
|
||||
-- reel it back a bit so we're less likely to end up inside a wall
|
||||
local back_x = pos_x - x
|
||||
local back_y = pos_y - y
|
||||
-- go back 20px from teleport target but don't go beyond initial teleport position
|
||||
local back_distance = math.min(20, get_magnitude(back_x, back_y))
|
||||
back_x, back_y = vec_normalize(back_x, back_y)
|
||||
x = x + back_x * back_distance
|
||||
y = y + back_y * back_distance
|
||||
|
||||
-- teleport
|
||||
teleport(pos_x, pos_y, x, y)
|
||||
set_cooldown(true, time_cooldown)
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- cooldown off
|
||||
set_cooldown(false, time_active)
|
Loading…
Add table
Add a link
Reference in a new issue