Skip to content

Commit

Permalink
Initial code commit
Browse files Browse the repository at this point in the history
  • Loading branch information
makidoll committed Apr 6, 2019
1 parent 69887da commit 2cfb02a
Show file tree
Hide file tree
Showing 6 changed files with 278 additions and 0 deletions.
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
.idea/
out/
target/
*.iml
*.log
19 changes: 19 additions & 0 deletions Jenkinsfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
pipeline {
agent {
docker {
image 'maven:3.6.0-jdk-8-alpine'
}
}
stages {
stage('Build') {
steps {
sh 'mvn -B package'
}
}
stage('Deliver') {
steps {
archiveArtifacts 'target/*.jar'
}
}
}
}
31 changes: 31 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>cat.maki</groupId>
<artifactId>MakiScreen</artifactId>
<version>1.0</version>

<repositories>
<repository>
<id>spigotmc-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
</repositories>

<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>

<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.13-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
89 changes: 89 additions & 0 deletions src/main/java/cat/maki/MakiScreen/MakiScreen.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package cat.maki.MakiScreen;

import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.server.MapInitializeEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.MapMeta;
import org.bukkit.map.MapCanvas;
import org.bukkit.map.MapRenderer;
import org.bukkit.map.MapView;
import org.bukkit.plugin.java.JavaPlugin;

import java.util.logging.Logger;

public final class MakiScreen extends JavaPlugin implements Listener {

private Logger logger = getLogger();

private int width = 128*2;
private int height = 128*1;

private VideoCapture videoCapture;

@Override
public void onEnable() {
logger.info("Hi!");
getServer().getPluginManager().registerEvents(this, this);

// BufferedImage original = ImageIO.read(new URL("https://cutelab.space/u/XjZRz2.png"));
// Graphics2D imageGraphics = image.createGraphics();
// imageGraphics.drawImage(original,0,0,128,128,null);
// imageGraphics.dispose();

videoCapture = new VideoCapture(width, height);
videoCapture.start();
}

@Override
public void onDisable() {
logger.info("Bye!");
videoCapture.cleanup();
}

@EventHandler
public void onMapInitialize(MapInitializeEvent e) {
MapView mapView = e.getMap();
int id = mapView.getId();
if (id>6) return;

mapView.setScale(MapView.Scale.FARTHEST);
mapView.setUnlimitedTracking(true);
mapView.getRenderers().clear();
mapView.addRenderer(new MapRenderer(true) {
@Override
public void render(MapView mapView, MapCanvas mapCanvas, Player player) {
videoCapture.renderCanvas(id, mapCanvas);
}
});
}

@Override
public boolean onCommand(CommandSender sender, Command command, String alias, String[] args) {
Player player = (Player) sender;

if (command.getName().equals("maki")) {
if (!player.isOp()) {
player.sendMessage("You dont have permission!");
return false;
}

for (int i=0; i<2; i++) {
ItemStack itemStack = new ItemStack(Material.FILLED_MAP);

MapMeta mapMeta = (MapMeta)itemStack.getItemMeta();
//mapMeta.setDisplayName("MakiScreen "+(i+1));
mapMeta.setMapId(i);
itemStack.setItemMeta(mapMeta);

player.getInventory().addItem(itemStack);
}
}

return true;
}
}
125 changes: 125 additions & 0 deletions src/main/java/cat/maki/MakiScreen/VideoCapture.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
package cat.maki.MakiScreen;

import org.bukkit.map.MapCanvas;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

// https://stackoverflow.com/questions/21420252/how-to-receive-mpeg-ts-stream-over-udp-from-ffmpeg-in-java
class VideoCaptureUDPServer extends Thread {
public boolean running = true;

private DatagramSocket socket;

public void onFrame(BufferedImage frame) { }

public void run() {
try {
byte[] buffer = new byte[1024*1024]; // 1 mb
socket = new DatagramSocket(1337);
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

ByteArrayOutputStream output = new ByteArrayOutputStream();

while (running) {
socket.receive(packet);

byte[] data = packet.getData();

if (data[0]==-1 && data[1]==-40) { // FF D8 (start of file)
if (output.size()>0) {
try {
ByteArrayInputStream stream = new ByteArrayInputStream(output.toByteArray());
onFrame(ImageIO.read(stream));
} catch (IOException e) {}

output.reset();
}
}

output.write(data,0,packet.getLength());
//System.out.println(String.format("%02X", data[0])+" "+String.format("%02X", data[1]));
}

} catch (IOException e) {
e.printStackTrace();
}
}

public void cleanup() {
running = false;
if (socket!=null) socket.disconnect();
if (socket!=null) socket.close();
}
}

public class VideoCapture extends Thread {
public Boolean active = true;
public int width;
public int height;

private BufferedImage currentFrame;

VideoCaptureUDPServer videoCaptureUDPServer;

private ProcessBuilder ffmpegCommand;


public void renderCanvas(int id, MapCanvas mapCanvas) {
BufferedImage frame = new BufferedImage(128, 128, BufferedImage.TYPE_INT_RGB);

Graphics2D graphics = frame.createGraphics();
switch (id) {
case 0: graphics.drawImage(currentFrame,0,0,null); break;
case 1: graphics.drawImage(currentFrame,-128,0,null); break;
//case 2: graphics.drawImage(currentFrame,-256,0,null); break;
//case 3: graphics.drawImage(currentFrame,0,-128,null); break;
//case 4: graphics.drawImage(currentFrame,-128,-128,null); break;
//case 5: graphics.drawImage(currentFrame,-256,-128,null); break;
}

mapCanvas.drawImage(0,0, frame);
graphics.dispose();
}

public VideoCapture(int width, int height) {
this.width = width;
this.height = height;

currentFrame = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

videoCaptureUDPServer = new VideoCaptureUDPServer() {
@Override
public void onFrame(BufferedImage frame) {
currentFrame = frame;
}
};

videoCaptureUDPServer.start();

// command = new ProcessBuilder(
// ("ffmpeg -y -f dshow -i video=\"OBS-Camera\" -vf scale="+width+":"+height+" -f rawvideo -c:v mjpeg -qscale:v 1 -r 20 tcp://127.0.0.1:1337")
// .split(" ")
// );
}

public void run() {
// while (active) {
// onFrame(getFrame());
// }
}

public void cleanup() {
videoCaptureUDPServer.cleanup();
}

public static void main(String[] args) {
//new VideoCapture(128*3, 128*2).start();
}
}
9 changes: 9 additions & 0 deletions src/main/resources/plugin.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
name: MakiScreen
description: Having fun!
version: 1.0
api-version: 1.13
main: cat.maki.MakiScreen.MakiScreen
commands:
maki:
description: Does things!
usage: /<command>

0 comments on commit 2cfb02a

Please sign in to comment.