func (p *pull) Think(ent game.Ent, g *game.Game) { player := ent.(*game.PlayerEnt) proc, ok := player.Processes[p.id].(*multiDrain) if !ok { return } if p.trigger && p.draining && proc.Stored > 1 { proc.Stored -= 0.1 if proc.Stored <= 1.0 { p.draining = false } for _, ent := range g.Ents { ray := ent.Pos().Sub(player.Pos()) if ray.Mag2() < 0.1 { continue } target_angle := ray.Angle() - player.Angle() for target_angle < 0 { target_angle += math.Pi * 2 } for target_angle > math.Pi*2 { target_angle -= math.Pi * 2 } if target_angle > p.angle/2 && target_angle < math.Pi*2-p.angle/2 { continue } ray = player.Pos().Sub(ent.Pos()) ray = ray.Norm() ent.ApplyForce(ray.Scale(-p.force)) player.ApplyForce(ray.Scale(p.force).Scale(0.01)) } } }