Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

multiple patches + some cleanup around touched patches #147

Open
wants to merge 35 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 16 commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
ac10e83
WIP
mechoriet Apr 23, 2023
0e0af19
work
mechoriet Apr 23, 2023
4401aa0
fix some comments and weird lines
mechoriet Apr 23, 2023
3690e28
rebase
mechoriet Apr 23, 2023
b470b39
woops wrong if changed
mechoriet Apr 27, 2023
c7d7d47
resolved some issues + add improved async task scheduler from akarin …
mechoriet Apr 30, 2023
1be1740
comments for api patches
mechoriet Apr 30, 2023
cf34f07
remove continued heavy call to checking if protocolsupport is there w…
mechoriet May 22, 2023
952429f
changes + removed one patch and combined it in worldutil patch touche…
mechoriet May 22, 2023
e38c6cf
fixes
mechoriet May 22, 2023
a160033
add more comments
mechoriet May 22, 2023
8a0b2a0
add comments
mechoriet May 24, 2023
64e8e17
breaks plugins since they don't get fired
mechoriet Jul 1, 2023
a6ee0ee
fixed some requested changes
mechoriet Jul 7, 2023
997aab6
this looks cleaner with same functionality without the redundent chec…
mechoriet Jul 7, 2023
a6421e6
resolved
mechoriet Jul 8, 2023
27e8790
revert this change cause event listener check was removed cause some …
mechoriet Jul 8, 2023
5477125
hmm
mechoriet Jul 8, 2023
532fda5
grrr
mechoriet Jul 8, 2023
fa255ab
grrr x2
mechoriet Jul 8, 2023
3974d49
use the fucking helper
uRyanxD Jul 9, 2023
d47ac79
use the fucking helper 2
uRyanxD Jul 9, 2023
e21b5ea
use helper 3
uRyanxD Jul 9, 2023
bb55352
cleanup
uRyanxD Jul 9, 2023
1f055e5
only call if has listener + use helper
uRyanxD Jul 9, 2023
7ca39c0
use helper 666
uRyanxD Jul 9, 2023
337cc5d
cleanup
uRyanxD Jul 9, 2023
fd1f8c1
ops
uRyanxD Jul 9, 2023
a0a888e
cleanup
uRyanxD Jul 9, 2023
37e8a5b
remove uneless y
uRyanxD Jul 9, 2023
c3a9639
ops
uRyanxD Jul 9, 2023
f687762
cleanup
uRyanxD Jul 10, 2023
a5b369d
ops
uRyanxD Jul 10, 2023
34b52d8
Merge branch 'master' into pr/multipatch
uRyanxD Sep 9, 2023
50f3090
rebuild patches
uRyanxD Sep 9, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions patches/api/0025-Add-a-call-helper-to-Event.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: mechoriet <[email protected]>
Date: Sun, 23 Apr 2023 11:59:58 +0200
Subject: [PATCH] Add a call helper to Event

Reduces diff in Server patches

diff --git a/src/main/java/org/bukkit/event/Event.java b/src/main/java/org/bukkit/event/Event.java
index 6677e1bd6f5ae4385d3da9fe39caaa75468ee1fa..6e924697c62c557e4f2cda3946bc2ffad6a952e7 100644
--- a/src/main/java/org/bukkit/event/Event.java
+++ b/src/main/java/org/bukkit/event/Event.java
@@ -75,6 +75,22 @@ public abstract class Event {
return async;
}

+ // PandaSpigot start
+ /**
+ * Calls the event and tests if cancelled.
+ *
+ * @return false if event was cancelled, if cancellable. otherwise true.
+ */
+ public boolean callEvent() {
+ org.bukkit.Bukkit.getPluginManager().callEvent(this);
+ if (this instanceof Cancellable) {
+ return !((Cancellable) this).isCancelled();
+ } else {
+ return true;
+ }
+ }
+ // PandaSpigot end
+
public enum Result {

/**
397 changes: 397 additions & 0 deletions patches/api/0026-Use-ASM-for-event-executors.patch

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: mechoriet <[email protected]>
Date: Sun, 23 Apr 2023 13:07:05 +0200
Subject: [PATCH] Performance & Concurrency Improvements to Permissions no
double lookup


diff --git a/src/main/java/org/bukkit/permissions/PermissibleBase.java b/src/main/java/org/bukkit/permissions/PermissibleBase.java
index 3b95061aad53083219ca653c1ab5c629c2254e05..aa607fe975b7740238082dc5034ad8556171108e 100644
--- a/src/main/java/org/bukkit/permissions/PermissibleBase.java
+++ b/src/main/java/org/bukkit/permissions/PermissibleBase.java
@@ -68,8 +68,11 @@ public class PermissibleBase implements Permissible {

String name = inName.toLowerCase();

- if (isPermissionSet(name)) {
- return permissions.get(name).getValue();
+ // PandaSpigot start
+ PermissionAttachmentInfo info = permissions.get(name);
+ if(info != null) {
+ return info.getValue();
+ // PandaSpigot end
} else {
Permission perm = Bukkit.getServer().getPluginManager().getPermission(name);

@@ -88,13 +91,16 @@ public class PermissibleBase implements Permissible {

String name = perm.getName().toLowerCase();

- if (isPermissionSet(name)) {
- return permissions.get(name).getValue();
+ // PandaSpigot start
+ PermissionAttachmentInfo info = permissions.get(name);
+ if(info != null) {
+ return info.getValue();
+ // PandaSpigot end
}
return perm.getDefault().getValue(isOp());
}

- public PermissionAttachment addAttachment(Plugin plugin, String name, boolean value) {
+ public synchronized PermissionAttachment addAttachment(Plugin plugin, String name, boolean value) { // PandaSpigot - synchronized
if (name == null) {
throw new IllegalArgumentException("Permission name cannot be null");
} else if (plugin == null) {
@@ -111,7 +117,7 @@ public class PermissibleBase implements Permissible {
return result;
}

- public PermissionAttachment addAttachment(Plugin plugin) {
+ public synchronized PermissionAttachment addAttachment(Plugin plugin) { // PandaSpigot - synchronized
if (plugin == null) {
throw new IllegalArgumentException("Plugin cannot be null");
} else if (!plugin.isEnabled()) {
@@ -126,7 +132,7 @@ public class PermissibleBase implements Permissible {
return result;
}

- public void removeAttachment(PermissionAttachment attachment) {
+ public synchronized void removeAttachment(PermissionAttachment attachment) { // PandaSpigot - synchronized
if (attachment == null) {
throw new IllegalArgumentException("Attachment cannot be null");
}
@@ -145,7 +151,7 @@ public class PermissibleBase implements Permissible {
}
}

- public void recalculatePermissions() {
+ public synchronized void recalculatePermissions() { // PandaSpigot - synchronized
clearPermissions();
Set<Permission> defaults = Bukkit.getServer().getPluginManager().getDefaultPermissions(isOp());
Bukkit.getServer().getPluginManager().subscribeToDefaultPerms(isOp(), parent);
@@ -192,7 +198,7 @@ public class PermissibleBase implements Permissible {
}
}

- public PermissionAttachment addAttachment(Plugin plugin, String name, boolean value, int ticks) {
+ public synchronized PermissionAttachment addAttachment(Plugin plugin, String name, boolean value, int ticks) { // PandaSpigot - synchronized
if (name == null) {
throw new IllegalArgumentException("Permission name cannot be null");
} else if (plugin == null) {
@@ -210,7 +216,7 @@ public class PermissibleBase implements Permissible {
return result;
}

- public PermissionAttachment addAttachment(Plugin plugin, int ticks) {
+ public synchronized PermissionAttachment addAttachment(Plugin plugin, int ticks) { // PandaSpigot - synchronized
if (plugin == null) {
throw new IllegalArgumentException("Plugin cannot be null");
} else if (!plugin.isEnabled()) {
@@ -228,7 +234,7 @@ public class PermissibleBase implements Permissible {
}
}

- public Set<PermissionAttachmentInfo> getEffectivePermissions() {
+ public synchronized Set<PermissionAttachmentInfo> getEffectivePermissions() { // PandaSpigot - synchronized
return new HashSet<PermissionAttachmentInfo>(permissions.values());
}

52 changes: 52 additions & 0 deletions patches/server/0001-Fix-Decompilation-errors.patch
Original file line number Diff line number Diff line change
Expand Up @@ -549,6 +549,19 @@ index 4bf790cdffdbc8950450644a813d9c7bb539793d..0446e2be5003e8aa785618de48767d16
}

}
diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java
index 0c49a256cc481af1ceb7a873b03763e1d942a362..7a7bb58d8632c34259215b1372140ececf5c825a 100644
--- a/src/main/java/net/minecraft/server/EntityPlayer.java
+++ b/src/main/java/net/minecraft/server/EntityPlayer.java
@@ -462,7 +462,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
EntityLiving entityliving = this.bt();

if (entityliving != null) {
- EntityTypes.MonsterEggInfo entitytypes_monsteregginfo = (EntityTypes.MonsterEggInfo) EntityTypes.eggInfo.get(Integer.valueOf(EntityTypes.a(entityliving)));
+ EntityTypes.MonsterEggInfo entitytypes_monsteregginfo = (EntityTypes.MonsterEggInfo) EntityTypes.eggInfo.get(EntityTypes.a(entityliving));

if (entitytypes_monsteregginfo != null) {
this.b(entitytypes_monsteregginfo.e);
diff --git a/src/main/java/net/minecraft/server/EntityTameableAnimal.java b/src/main/java/net/minecraft/server/EntityTameableAnimal.java
index 2b170a15a42b257e92178df8124fd4ce64fa26c9..1cc087d0470c60e26f7c585e1d50156bce6b1f46 100644
--- a/src/main/java/net/minecraft/server/EntityTameableAnimal.java
Expand Down Expand Up @@ -2563,6 +2576,45 @@ index 63fbf9447e1b7250613ee39e72c3d7fae35f3081..906aa3d7e54887a29e241a90abe50e84
}

public void a(IJsonStatistic ijsonstatistic) {
diff --git a/src/main/java/net/minecraft/server/StructureGenerator.java b/src/main/java/net/minecraft/server/StructureGenerator.java
index e76acfc4f39287f8f3078ce1b2516d4ca8fc4c6c..91f2e401f2be2baf3cfc350b0c338f5fae2e9b2d 100644
--- a/src/main/java/net/minecraft/server/StructureGenerator.java
+++ b/src/main/java/net/minecraft/server/StructureGenerator.java
@@ -18,14 +18,14 @@ public abstract class StructureGenerator extends WorldGenBase {

protected final void a(World world, final int i, final int j, int k, int l, ChunkSnapshot chunksnapshot) {
this.a(world);
- if (!this.e.containsKey(Long.valueOf(ChunkCoordIntPair.a(i, j)))) {
+ if (!this.e.containsKey(ChunkCoordIntPair.a(i, j))) {
this.b.nextInt();

try {
if (this.a(i, j)) {
StructureStart structurestart = this.b(i, j);

- this.e.put(Long.valueOf(ChunkCoordIntPair.a(i, j)), structurestart);
+ this.e.put(ChunkCoordIntPair.a(i, j), structurestart);
this.a(i, j, structurestart);
}

@@ -42,7 +42,7 @@ public abstract class StructureGenerator extends WorldGenBase {
return this.a();
}
});
- crashreportsystemdetails.a("Chunk location", (Object) String.format("%d,%d", new Object[] { Integer.valueOf(i), Integer.valueOf(j)}));
+ crashreportsystemdetails.a("Chunk location", (Object) String.format("%d,%d", new Object[] {i, j}));
crashreportsystemdetails.a("Chunk pos hash", new Callable() {
public String a() throws Exception {
return String.valueOf(ChunkCoordIntPair.a(i, j));
@@ -226,7 +226,7 @@ public abstract class StructureGenerator extends WorldGenBase {
StructureStart structurestart = WorldGenFactory.a(nbttagcompound1, world);

if (structurestart != null) {
- this.e.put(Long.valueOf(ChunkCoordIntPair.a(i, j)), structurestart);
+ this.e.put(ChunkCoordIntPair.a(i, j), structurestart);
}
}
}
diff --git a/src/main/java/net/minecraft/server/WeightedRandom.java b/src/main/java/net/minecraft/server/WeightedRandom.java
index 2bbcfa3c7bbb9f304f4817dd1f9a260e7df366b1..58789a31ed2d1fdda2c33a576957c3ed9e30ec78 100644
--- a/src/main/java/net/minecraft/server/WeightedRandom.java
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ Subject: [PATCH] Backport PlayerHandshakeEvent from Paper
This patch was added in Paper 1.9.4, and is used by plugins such as BungeeGuard to listen to and modify handshake packets without requiring a packet listener such as ProtocolLib.

diff --git a/src/main/java/net/minecraft/server/HandshakeListener.java b/src/main/java/net/minecraft/server/HandshakeListener.java
index 215648ece51b9e0316bae17de60abccfd40f8b35..b7615b1472470805e6ee2a49dd8d4cdca4f70806 100644
index 215648ece51b9e0316bae17de60abccfd40f8b35..86983cf73637dee23bc0d2f24fa074c515237bbb 100644
--- a/src/main/java/net/minecraft/server/HandshakeListener.java
+++ b/src/main/java/net/minecraft/server/HandshakeListener.java
@@ -72,8 +72,36 @@ public class HandshakeListener implements PacketHandshakingInListener {
@@ -72,8 +72,35 @@ public class HandshakeListener implements PacketHandshakingInListener {
this.b.close(chatcomponenttext);
} else {
this.b.a((PacketListener) (new LoginListener(this.a, this.b)));
Expand All @@ -20,8 +20,7 @@ index 215648ece51b9e0316bae17de60abccfd40f8b35..b7615b1472470805e6ee2a49dd8d4cdc
+ if (com.destroystokyo.paper.event.player.PlayerHandshakeEvent.getHandlerList().getRegisteredListeners().length != 0) { // Hello? Can you hear me?
+ java.net.SocketAddress socketAddress = this.b.l;
+ String hostnameOfRemote = socketAddress instanceof java.net.InetSocketAddress ? ((java.net.InetSocketAddress) socketAddress).getHostString() : InetAddress.getLoopbackAddress().getHostAddress();
+ com.destroystokyo.paper.event.player.PlayerHandshakeEvent event = new com.destroystokyo.paper.event.player.PlayerHandshakeEvent(packethandshakinginsetprotocol.hostname, hostnameOfRemote, !proxyLogicEnabled);
+ org.bukkit.Bukkit.getPluginManager().callEvent(event);
+ com.destroystokyo.paper.event.player.PlayerHandshakeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEvent(new com.destroystokyo.paper.event.player.PlayerHandshakeEvent(packethandshakinginsetprotocol.hostname, hostnameOfRemote, !proxyLogicEnabled));
+ if (!event.isCancelled()) {
+ // If we've failed somehow, let the client know so and go no further.
+ if (event.isFailed()) {
Expand Down
6 changes: 3 additions & 3 deletions patches/server/0007-Add-Unix-domain-socket-support.patch
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ This feature can be enabled by setting the "server-ip" field in server.propertie
Currently, this feature is only supported on Linux environments with Epoll available.

diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java
index 8e8330fbd317807c4e8ad7f8910fd86fff9a43d3..2c9d1944f186b66726fec19d07601d2bb6507380 100644
index 6434b8613971a228fb0074390d8223bfcefe4e9f..ee6a6b379575b0d0b10b96bac4ae8e1ffa810b8f 100644
--- a/src/main/java/net/minecraft/server/DedicatedServer.java
+++ b/src/main/java/net/minecraft/server/DedicatedServer.java
@@ -165,6 +165,28 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer
Expand Down Expand Up @@ -76,7 +76,7 @@ index 8e8330fbd317807c4e8ad7f8910fd86fff9a43d3..2c9d1944f186b66726fec19d07601d2b
DedicatedServer.LOGGER.warn("**** FAILED TO BIND TO PORT!");
DedicatedServer.LOGGER.warn("The exception was: {}", new Object[] { ioexception.toString()});
diff --git a/src/main/java/net/minecraft/server/HandshakeListener.java b/src/main/java/net/minecraft/server/HandshakeListener.java
index b7615b1472470805e6ee2a49dd8d4cdca4f70806..578a417bda8dddbd46db77cfe0304d9dc06ce4cf 100644
index 86983cf73637dee23bc0d2f24fa074c515237bbb..c89ad49882faca4376540009a96a479f456f3a8e 100644
--- a/src/main/java/net/minecraft/server/HandshakeListener.java
+++ b/src/main/java/net/minecraft/server/HandshakeListener.java
@@ -29,6 +29,7 @@ public class HandshakeListener implements PacketHandshakingInListener {
Expand All @@ -95,7 +95,7 @@ index b7615b1472470805e6ee2a49dd8d4cdca4f70806..578a417bda8dddbd46db77cfe0304d9d
} catch (Throwable t) {
org.apache.logging.log4j.LogManager.getLogger().debug("Failed to check connection throttle", t);
}
@@ -104,8 +106,11 @@ public class HandshakeListener implements PacketHandshakingInListener {
@@ -103,8 +105,11 @@ public class HandshakeListener implements PacketHandshakingInListener {
//if (org.spigotmc.SpigotConfig.bungee) { // PandaSpigot - comment out, we check above!
String[] split = packethandshakinginsetprotocol.hostname.split("\00");
if ( split.length == 3 || split.length == 4 ) {
Expand Down
9 changes: 4 additions & 5 deletions patches/server/0022-EntityMoveEvent.patch
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ Subject: [PATCH] EntityMoveEvent


diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java
index 72c7e6fc8bb0a71877d6759af44d39030bcf51f5..cd95aa17291d31e3cebe9f6488a43923a18facba 100644
index 72c7e6fc8bb0a71877d6759af44d39030bcf51f5..077d17a62570057c54814b63d55c9a51cf90a131 100644
--- a/src/main/java/net/minecraft/server/EntityLiving.java
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
@@ -1665,6 +1665,22 @@ public abstract class EntityLiving extends Entity {
@@ -1665,6 +1665,21 @@ public abstract class EntityLiving extends Entity {
}

this.world.methodProfiler.b();
Expand All @@ -18,8 +18,7 @@ index 72c7e6fc8bb0a71877d6759af44d39030bcf51f5..cd95aa17291d31e3cebe9f6488a43923
+ org.bukkit.Location from = new org.bukkit.Location(this.world.getWorld(), this.lastX, this.lastY, this.lastZ, this.lastYaw, this.lastPitch);
+ org.bukkit.Location to = new org.bukkit.Location (this.world.getWorld(), this.locX, this.locY, this.locZ, this.yaw, this.pitch);
+ io.papermc.paper.event.entity.EntityMoveEvent event = new io.papermc.paper.event.entity.EntityMoveEvent((LivingEntity) this.getBukkitEntity(), from, to.clone());
+ Bukkit.getPluginManager().callEvent(event);
+ if (event.isCancelled()) {
+ if (CraftEventFactory.callEvent(event).isCancelled()) {
+ // if cancelled, set back to previous position
+ this.setLocation(from.getX(), from.getY(), from.getZ(), from.getYaw(), from.getPitch());
+ } else if (!to.equals(event.getTo())) {
Expand All @@ -32,7 +31,7 @@ index 72c7e6fc8bb0a71877d6759af44d39030bcf51f5..cd95aa17291d31e3cebe9f6488a43923

protected void doTick() {}
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index 9e3bb94f11263c4614f18c282ae236d03599619a..f6d1510fc16fc48be221cc7bb5968a132a2b9752 100644
index b7decb879f530345b82722aeb1294864feecd2c2..66d4c410c2bcc345bf09e07a63de7534064524d2 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -926,6 +926,7 @@ public abstract class MinecraftServer extends com.hpfxd.pandaspigot.tickloop.Ree
Expand Down
9 changes: 4 additions & 5 deletions patches/server/0037-Sound-events.patch
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,16 @@ Subject: [PATCH] Sound events


diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
index 73de7d6d4dc619416363a7d8557b71b850313cfb..3795d7f097c8051e5e80f6920d1b3fd69531c994 100644
index 73de7d6d4dc619416363a7d8557b71b850313cfb..94f98081c02fd068d41d259915e15951826dcb52 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -944,20 +944,57 @@ public abstract class World implements IBlockAccess {
@@ -944,20 +944,56 @@ public abstract class World implements IBlockAccess {
}

public void makeSound(Entity entity, String s, float f, float f1) {
+ // PandaSpigot start - EntitySoundEvent
+ com.hpfxd.pandaspigot.event.sound.EntitySoundEvent event = new com.hpfxd.pandaspigot.event.sound.EntitySoundEvent(
+ entity.bukkitEntity, s, f, f1);
+ this.getServer().getPluginManager().callEvent(event);
+ com.hpfxd.pandaspigot.event.sound.EntitySoundEvent event = CraftEventFactory.callEvent(new com.hpfxd.pandaspigot.event.sound.EntitySoundEvent(
+ entity.bukkitEntity, s, f, f1));
+ if (event.isCancelled()) return;
+
+ org.bukkit.Location loc = event.getLocation();
Expand Down
4 changes: 2 additions & 2 deletions patches/server/0052-Add-packet-limiter-config.patch
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ index 0000000000000000000000000000000000000000..d61d44e8e1126ed3bea6e633cc0bdebb
+ }
+}
diff --git a/src/main/java/net/minecraft/server/NetworkManager.java b/src/main/java/net/minecraft/server/NetworkManager.java
index df8ff41f691626de37f706df187269bee032358f..5c631068db79615bf51ed357bc9bda2b0ebb0c3b 100644
index df8ff41f691626de37f706df187269bee032358f..87ecc1b9a46bfcc146b7b42f142cac46c02faa9c 100644
--- a/src/main/java/net/minecraft/server/NetworkManager.java
+++ b/src/main/java/net/minecraft/server/NetworkManager.java
@@ -113,6 +113,22 @@ public class NetworkManager extends SimpleChannelInboundHandler<Packet> {
Expand All @@ -325,7 +325,7 @@ index df8ff41f691626de37f706df187269bee032358f..5c631068db79615bf51ed357bc9bda2b
+ this.close(reason[0]);
+ this.k();
+ this.stopReadingPackets = true;
+ }, null);
+ }, (GenericFutureListener<? extends Future<? super Void>>) null);
+ }
+ // PandaSpigot end - packet limiter
public NetworkManager(EnumProtocolDirection enumprotocoldirection) {
Expand Down
Loading