Skip to content

Commit

Permalink
Initial Commit
Browse files Browse the repository at this point in the history
  • Loading branch information
ZockerAxel committed Nov 22, 2021
0 parents commit c893030
Show file tree
Hide file tree
Showing 27 changed files with 3,758 additions and 0 deletions.
23 changes: 23 additions & 0 deletions plugin.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
main: eu.endercentral.crazy_advancements.CrazyAdvancementsAPI
name: CrazyAdvancementsAPI
version: 2.0
api-version: 1.13
load: startup
author: ZockerAxel
commands:
grant:
usage: /cagrant <Player> <Manager> <Advancement> [Criteria...]
description: Grants <Advancement>-[Criteria...] to <Player> in <Manager>
aliases: [cagrant]
revoke:
usage: /carevoke <Player> <Manager> <Advancement> [Criteria...]
description: Revokes <Advancement>-[Criteria...] from <Player> in <Manager>
aliases: [carevoke]
setprogress:
usage: /setprogress <Player> <Manager> <Advancement> <Number>
description: Sets <Advancement> Progress for <Player> in <Manager>
aliases: [caprogress]
showtoast:
usage: /showtoast <Player> <Icon> <Message>
description: Displays a Toast Advancement Message
aliases: [catoast, toast]
33 changes: 33 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<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>eu.endercentral.crazy_advancements</groupId>
<artifactId>CrazyAdvancementsAPI</artifactId>
<version>2.0</version>
<packaging>jar</packaging>

<name>CrazyAdvancementsAPI</name>
<url>https://crazyadvancements.endercentral.eu</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.17-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>

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

</project>
123 changes: 123 additions & 0 deletions src/eu/endercentral/crazy_advancements/AdvancementPacketReceiver.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
package eu.endercentral.crazy_advancements;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;

import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer;
import org.bukkit.entity.Player;

import eu.endercentral.crazy_advancements.event.AdvancementScreenCloseEvent;
import eu.endercentral.crazy_advancements.event.AdvancementTabChangeEvent;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPipeline;
import io.netty.handler.codec.MessageToMessageDecoder;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.game.PacketPlayInAdvancements;
import net.minecraft.network.protocol.game.PacketPlayInAdvancements.Status;

public class AdvancementPacketReceiver {

private static HashMap<String, ChannelHandler> handlers = new HashMap<>();
private static Field channelField;

{
for(Field f : NetworkManager.class.getDeclaredFields()) {
if(f.getType().isAssignableFrom(Channel.class)) {
channelField = f;
channelField.setAccessible(true);
break;
}
}
}

interface PacketReceivingHandler {
public boolean handle(Player p, PacketPlayInAdvancements packet);
}

public ChannelHandler listen(final Player p, final PacketReceivingHandler handler) {
Channel ch = getNettyChannel(p);
ChannelPipeline pipe = ch.pipeline();

ChannelHandler handle = new MessageToMessageDecoder<Packet<?>>() {
@Override
protected void decode(ChannelHandlerContext chc, Packet<?> packet, List<Object> out) throws Exception {

if(packet instanceof PacketPlayInAdvancements) {
if(!handler.handle(p, (PacketPlayInAdvancements) packet)) {
out.add(packet);
}
return;
}

out.add(packet);
}
};
pipe.addAfter("decoder", "endercentral_crazy_advancements_listener_" + handler.hashCode(), handle);


return handle;
}

public Channel getNettyChannel(Player p) {
NetworkManager manager = ((CraftPlayer)p).getHandle().b.a;
Channel channel = null;
try {
channel = (Channel) channelField.get(manager);
} catch (IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
return channel;
}

public boolean close(Player p, ChannelHandler handler) {
try {
ChannelPipeline pipe = getNettyChannel(p).pipeline();
pipe.remove(handler);
return true;
} catch(Exception e) {
return false;
}
}

public HashMap<String, ChannelHandler> getHandlers() {
return handlers;
}

public void initPlayer(Player p) {
handlers.put(p.getName(), listen(p, new PacketReceivingHandler() {

@Override
public boolean handle(Player p, PacketPlayInAdvancements packet) {

if(packet.c() == Status.a) {
NameKey name = new NameKey(packet.d());
AdvancementTabChangeEvent event = new AdvancementTabChangeEvent(p, name);
Bukkit.getPluginManager().callEvent(event);

if(event.isCancelled()) {
CrazyAdvancementsAPI.clearActiveTab(p);
return false;
} else {
if(!event.getTabAdvancement().equals(name)) {
CrazyAdvancementsAPI.setActiveTab(p, event.getTabAdvancement());
} else {
CrazyAdvancementsAPI.setActiveTab(p, name, false);
}
}
} else {
AdvancementScreenCloseEvent event = new AdvancementScreenCloseEvent(p);
Bukkit.getPluginManager().callEvent(event);
}


return true;
}
}));
}

}
Loading

0 comments on commit c893030

Please sign in to comment.