Skip to content

Commit

Permalink
mnet was a mistake
Browse files Browse the repository at this point in the history
  • Loading branch information
Anuken committed Aug 24, 2019
1 parent b7dff91 commit fd97303
Show file tree
Hide file tree
Showing 12 changed files with 439 additions and 378 deletions.
4 changes: 2 additions & 2 deletions android/src/io/anuke/mindustry/AndroidLauncher.java
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,8 @@ public boolean canDonate(){
}

config.hideStatusBar = true;
Net.setClientProvider(new MClient());
Net.setServerProvider(new MServer());
Net.setClientProvider(new ArcNetClient());
Net.setServerProvider(new ArcNetServer());
initialize(new Mindustry(), config);
checkFiles(getIntent());
}
Expand Down
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ project(":core"){
compile "org.lz4:lz4-java:1.4.1"
compile arcModule("arc-core")
compile arcModule("extensions:freetype")
compile arcModule("extensions:mnet")
compile arcModule("extensions:arcnet")
if(localArc() && debugged()) compile arcModule("extensions:recorder")

compileOnly project(":annotations")
Expand Down
3 changes: 2 additions & 1 deletion desktop/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ sourceSets.main.java.srcDirs = [ "src/" ]
project.ext.mainClassName = "io.anuke.mindustry.desktop.DesktopLauncher"
project.ext.assetsDir = new File("../core/assets")

def enableTemplates = true
def JDK_DIR = "$System.env.PACKR_DIR"
def ICON_DIR = new File("core/assets/icons/icon.icns")

Expand Down Expand Up @@ -63,7 +64,7 @@ PackrConfig.Platform.values().each{ platform ->
delete "build/packr/output/"
}

if(platform == PackrConfig.Platform.Windows32 || platform == PackrConfig.Platform.Windows64){
if(enableTemplates && (platform == PackrConfig.Platform.Windows64)){
copy{
into "build/packr/output"
from "${JDK_DIR}/templates/${platform.toString().toLowerCase()}"
Expand Down
4 changes: 2 additions & 2 deletions desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ public static void main(String[] arg){
try{
Platform.instance = new DesktopPlatform(arg);

Net.setClientProvider(new MClient());
Net.setServerProvider(new MServer());
Net.setClientProvider(new ArcNetClient());
Net.setServerProvider(new ArcNetServer());

new SdlApplication(new Mindustry(), new SdlConfig(){{
title = "Mindustry";
Expand Down
4 changes: 2 additions & 2 deletions ios/src/io/anuke/mindustry/IOSLauncher.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ public class IOSLauncher extends IOSApplication.Delegate{

@Override
protected IOSApplication createApplication(){
Net.setClientProvider(new MClient());
Net.setServerProvider(new MServer());
Net.setClientProvider(new ArcNetClient());
Net.setServerProvider(new ArcNetServer());

if(UIDevice.getCurrentDevice().getUserInterfaceIdiom() == UIUserInterfaceIdiom.Pad){
UnitScl.dp.addition = 0.5f;
Expand Down
189 changes: 189 additions & 0 deletions net/src/io/anuke/mindustry/net/ArcNetClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
package io.anuke.mindustry.net;

import io.anuke.arc.*;
import io.anuke.arc.collection.*;
import io.anuke.arc.function.*;
import io.anuke.arc.net.*;
import io.anuke.arc.util.async.*;
import io.anuke.arc.util.pooling.*;
import io.anuke.mindustry.net.Net.*;
import io.anuke.mindustry.net.Packets.*;

import java.io.*;
import java.net.*;
import java.nio.*;
import java.nio.channels.*;

import static io.anuke.mindustry.Vars.*;

public class ArcNetClient implements ClientProvider{
final Client client;
final Supplier<DatagramPacket> packetSupplier = () -> new DatagramPacket(new byte[256], 256);

public ArcNetClient(){
client = new Client(8192, 4096, new PacketSerializer());
client.setDiscoveryPacket(packetSupplier);

NetListener listener = new NetListener(){
@Override
public void connected(Connection connection){
Connect c = new Connect();
c.addressTCP = connection.getRemoteAddressTCP().getAddress().getHostAddress();
c.id = connection.getID();
if(connection.getRemoteAddressTCP() != null) c.addressTCP = connection.getRemoteAddressTCP().toString();

Core.app.post(() -> Net.handleClientReceived(c));
}

@Override
public void disconnected(Connection connection){
if(connection.getLastProtocolError() != null){
netClient.setQuiet();
}

Disconnect c = new Disconnect();
Core.app.post(() -> Net.handleClientReceived(c));
}

@Override
public void received(Connection connection, Object object){
if(object instanceof FrameworkMessage) return;

Core.app.post(() -> {
try{
Net.handleClientReceived(object);
}catch(Exception e){
handleException(e);
}
});

}
};

client.addListener(listener);
}

private static boolean isLocal(InetAddress addr){
if(addr.isAnyLocalAddress() || addr.isLoopbackAddress()) return true;

try{
return NetworkInterface.getByInetAddress(addr) != null;
}catch(Exception e){
return false;
}
}

@Override
public void connect(String ip, int port, Runnable success){
Threads.daemon(() -> {
try{
//just in case
client.stop();

Threads.daemon("Net Client", () -> {
try{
client.run();
}catch(Exception e){
if(!(e instanceof ClosedSelectorException)) handleException(e);
}
});

client.connect(5000, ip, port, port);
success.run();
}catch(Exception e){
handleException(e);
}
});
}

@Override
public void disconnect(){
client.close();
}

@Override
public void send(Object object, SendMode mode){
try{
if(mode == SendMode.tcp){
client.sendTCP(object);
}else{
client.sendUDP(object);
}
//sending things can cause an under/overflow, catch it and disconnect instead of crashing
}catch(BufferOverflowException | BufferUnderflowException e){
Net.showError(e);
}

Pools.free(object);
}

@Override
public void updatePing(){
client.updateReturnTripTime();
}

@Override
public int getPing(){
return client.getReturnTripTime();
}

@Override
public void pingHost(String address, int port, Consumer<Host> valid, Consumer<Exception> invalid){
Threads.daemon(() -> {
try{
DatagramSocket socket = new DatagramSocket();
socket.send(new DatagramPacket(new byte[]{-2, 1}, 2, InetAddress.getByName(address), port));
socket.setSoTimeout(2000);

DatagramPacket packet = packetSupplier.get();
socket.receive(packet);

ByteBuffer buffer = ByteBuffer.wrap(packet.getData());
Host host = NetworkIO.readServerData(packet.getAddress().getHostAddress(), buffer);

Core.app.post(() -> valid.accept(host));
}catch(Exception e){
Core.app.post(() -> invalid.accept(e));
}
});
}

@Override
public void discover(Consumer<Host> callback, Runnable done){
Array<InetAddress> foundAddresses = new Array<>();
client.discoverHosts(port, multicastGroup, multicastPort, 3000, packet -> {
Core.app.post(() -> {
try{
if(foundAddresses.contains(address -> address.equals(packet.getAddress()) || (isLocal(address) && isLocal(packet.getAddress())))){
return;
}
ByteBuffer buffer = ByteBuffer.wrap(packet.getData());
Host host = NetworkIO.readServerData(packet.getAddress().getHostAddress(), buffer);
callback.accept(host);
foundAddresses.add(packet.getAddress());
}catch(Exception e){
//don't crash when there's an error pinging a a server or parsing data
e.printStackTrace();
}
});
}, () -> Core.app.post(done));
}

@Override
public void dispose(){
try{
client.dispose();
}catch(IOException e){
throw new RuntimeException(e);
}
}

private void handleException(Exception e){
if(e instanceof ArcNetException){
Core.app.post(() -> Net.showError(new IOException("mismatch")));
}else{
Core.app.post(() -> Net.showError(e));
}
}

}
Loading

0 comments on commit fd97303

Please sign in to comment.