mining faster update + npc

This commit is contained in:
NK 2022-11-21 20:30:00 +00:00
parent d697a7bb26
commit 05ca15ef0c
8 changed files with 198 additions and 40 deletions

View file

@ -8,13 +8,12 @@ import me.night.nullvalkyrie.events.CustomItemEvents;
import me.night.nullvalkyrie.events.DamageEffect;
import me.night.nullvalkyrie.hardpoint.ConfigManager;
import me.night.nullvalkyrie.items.CustomItemManager;
import me.night.nullvalkyrie.npc.NPC;
import me.night.nullvalkyrie.rank.ScoreboardListener;
import me.night.nullvalkyrie.util.Util;
import me.night.nullvalkyrie.commands.*;
import me.night.nullvalkyrie.database.Client;
import me.night.nullvalkyrie.miners.CryptoMiner;
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.*;
import org.bukkit.boss.BarColor;
import org.bukkit.boss.BarStyle;
@ -37,6 +36,7 @@ public final class Main extends JavaPlugin implements Listener {
public void onEnable() {
getConfig().options().copyDefaults();
saveDefaultConfig();
new NPC(this);
EnchantmentManager.register();
new CustomItemManager(this);
updateYamlFilesToPlugin("shop.yml");

View file

@ -2,12 +2,11 @@ package me.night.nullvalkyrie.commands;
import net.minecraft.network.protocol.game.PacketPlayOutOpenWindow;
import net.minecraft.server.level.EntityPlayer;
import net.minecraft.server.network.PlayerConnection;
import net.minecraft.world.inventory.Containers;
import org.bukkit.command.CommandSender;
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_19_R1.util.CraftChatMessage;
import org.bukkit.entity.Player;
import java.util.List;
@ -28,11 +27,11 @@ public class AnvilCommand extends Command {
if (sender instanceof Player) {
Player player = (Player) sender;
CraftPlayer craftPlayer = (CraftPlayer) player;
EntityPlayer entityPlayer = craftPlayer.getHandle();
int id = 0;
PacketPlayOutOpenWindow OpenWindow = new PacketPlayOutOpenWindow(id, Containers.h, CraftChatMessage.fromStringOrNull("Test"));
PlayerConnection playerConnection = entityPlayer.b;
playerConnection.a(OpenWindow);
// EntityPlayer entityPlayer = craftPlayer.getHandle();
// int id = 0;
// PacketPlayOutOpenWindow OpenWindow = new PacketPlayOutOpenWindow(id, Containers.h, CraftChatMessage.fromStringOrNull("Test"));
// PlayerConnection playerConnection = entityPlayer.b;
// playerConnection.a(OpenWindow);
}
}

View file

@ -1,41 +1,29 @@
package me.night.nullvalkyrie.commands;
import me.night.nullvalkyrie.Main;
import net.minecraft.network.protocol.game.PacketPlayOutEntityHeadRotation;
import net.minecraft.server.level.EntityPlayer;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import me.night.nullvalkyrie.npc.NPC;
import org.bukkit.command.CommandSender;
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import java.util.List;
public class BetaCommand extends Command {
private Main main;
public BetaCommand(Main main) {
super("beta", new String[]{"b"}, "Beta", "");
super("beta", new String[]{"b", "npc"}, "Beta", "");
this.main = main;
}
@Override
public void onCommand(CommandSender sender, String[] args) {
if (sender instanceof Player) {
Player pa = (Player) sender;
// CraftPlayer cp = (CraftPlayer) sender;
// EntityPlayer ep = cp.getHandle();
// PacketPlayOutUpdateHealth packet = new PacketPlayOutUpdateHealth(20f, 20, 5.0f); // health, food, food saturation
// ep.b.a(packet); // Sends the Packet
Player player = (Player) sender;
NPC.createNPC(player, "&a&lNK");
}
}
@Override
public List<String> onTabComplete(CommandSender sender, String[] args) {
return null;
}
}
}

View file

@ -8,6 +8,7 @@ import com.comphenix.protocol.wrappers.BlockPosition;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import me.night.nullvalkyrie.items.CustomItemManager;
import me.night.nullvalkyrie.items.Pickaxe;
import me.night.nullvalkyrie.items.Rarity;
import me.night.nullvalkyrie.Main;
import net.md_5.bungee.api.ChatMessageType;
@ -321,19 +322,26 @@ public class CustomItemEvents implements Listener {
// System.out.println(e.getEntity().getLocation());
// e.getEntity().setCustomName(ChatColor.RED + "Changed name since you ust clicked lol");
// }
private final Cache<UUID, Long> BreakAbility = CacheBuilder.newBuilder().expireAfterWrite(60, TimeUnit.MILLISECONDS).build();
private final HashMap<Location, Integer> blockStages = new HashMap<>();
private final HashMap<UUID, Long> miningCooldown = new HashMap<>();
@EventHandler
public void onAnimationEvent(PlayerAnimationEvent e) {
public void onAnimationEvent(PlayerAnimationEvent e) { //Material blockType, int mineInterval, Pickaxe x
Player player = e.getPlayer();
UUID uuid = player.getUniqueId();
if (!player.getGameMode().equals(GameMode.SURVIVAL)) return;
if (BreakAbility.asMap().containsKey(player.getUniqueId())) return;
if (miningCooldown.containsKey(uuid) && (miningCooldown.get(uuid) > System.currentTimeMillis())) return;
else miningCooldown.remove(uuid);
if (!e.getAnimationType().equals(PlayerAnimationType.ARM_SWING)) return;
Block block = player.getTargetBlockExact(4);
if (block == null) return;
BreakAbility.put(player.getUniqueId(), System.currentTimeMillis() + 60);
Pickaxe pickaxe = new Pickaxe(player.getInventory().getItemInMainHand());
List<Material> materialsThatCanBeMinedFast = pickaxe.multimap.get(pickaxe.getMaterial()); // to get all materials that the pickaxe can mine
if (!materialsThatCanBeMinedFast.contains(block.getType())) return;
long miningPerPhase = pickaxe.getMiningPerPhase(block.getType());
miningCooldown.put(uuid, System.currentTimeMillis() + miningPerPhase);
int blockStage = blockStages.getOrDefault(block.getLocation(), 0);
blockStage = blockStage == 10 ? 0 : blockStage + 1;
blockStages.put(block.getLocation(), blockStage);
@ -343,9 +351,10 @@ public class CustomItemEvents implements Listener {
block.breakNaturally();
}
}
ProtocolManager manager = ProtocolLibrary.getProtocolManager();
public void sendBlockDamage(Player player, Location location) {
public void sendBlockDamage(Player player, Block block) {
Location location = block.getLocation();
int locationId = location.getBlockX() + location.getBlockY() + location.getBlockZ();
PacketContainer packet = manager.createPacket(PacketType.Play.Server.BLOCK_BREAK_ANIMATION);
packet.getIntegers().write(0, locationId); // set entity ID to the location
@ -357,8 +366,4 @@ public class CustomItemEvents implements Listener {
e.printStackTrace();
}
}
public void sendBlockDamage(Player player, Block block) {
sendBlockDamage(player, block.getLocation());
}
}

View file

@ -0,0 +1,26 @@
package me.night.nullvalkyrie.items;
import com.google.common.collect.ArrayListMultimap;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import java.util.HashMap;
public class Pickaxe {
public ArrayListMultimap<Material, Material> multimap = ArrayListMultimap.create();
public HashMap<Material, Long> phases = new HashMap<>();
private final ItemStack itemStack;
public Pickaxe(ItemStack item) {
multimap.put(Material.STONE_PICKAXE, Material.IRON_ORE); //put some blocks and pickaxe to mine
multimap.put(Material.STONE_PICKAXE, Material.DIAMOND_ORE);
phases.put(Material.DIAMOND_ORE, 40L);
phases.put(Material.IRON_ORE, 30L);
itemStack = item;
}
public long getMiningPerPhase(Material material) {
return phases.get(material);
}
public Material getMaterial() {
return itemStack.getType();
}
}

View file

@ -0,0 +1,87 @@
package me.night.nullvalkyrie.npc;
import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import com.mojang.datafixers.util.Pair;
import me.night.nullvalkyrie.Main;
import me.night.nullvalkyrie.util.Util;
import net.minecraft.network.protocol.game.*;
import net.minecraft.network.syncher.DataWatcher;
import net.minecraft.network.syncher.DataWatcherObject;
import net.minecraft.network.syncher.DataWatcherRegistry;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.EntityPlayer;
import net.minecraft.server.level.WorldServer;
import net.minecraft.server.network.PlayerConnection;
import net.minecraft.world.entity.EnumItemSlot;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.craftbukkit.v1_19_R1.CraftWorld;
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class NPC {
private static Main main;
public NPC(Main main) {
NPC.main = main;
}
private static final List<EntityPlayer> NPCs = new ArrayList<>();
public static List<EntityPlayer> getNPCs() {
return NPCs;
}
public static void createNPC(Player player, String name) { //name must be less than 16 characters including color codes **
CraftPlayer creaftPlayer = (CraftPlayer) player;
EntityPlayer sp = creaftPlayer.getHandle();
MinecraftServer server = sp.c;
WorldServer level = ((CraftWorld) Bukkit.getWorld(player.getWorld().getName())).getHandle();
GameProfile gameProfile = new GameProfile(UUID.randomUUID(), Util.color(name));
String[] skin = Skin.getSkin("Lendortv");
gameProfile.getProperties().put("textures", new Property("textures", skin[0], skin[1]));
EntityPlayer npc = new EntityPlayer(server, level, gameProfile, null);
Location location = player.getLocation();
npc.a(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
addNPCPacket(npc);
NPCs.add(npc);
}
public static void addNPCPacket(EntityPlayer npc) {
for(Player player : Bukkit.getOnlinePlayers()) {
CraftPlayer creaftPlayer = (CraftPlayer) player;
EntityPlayer sp = creaftPlayer.getHandle();
PlayerConnection pc = sp.b;
pc.a(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.a, npc));
pc.a(new PacketPlayOutNamedEntitySpawn(npc));
pc.a(new PacketPlayOutEntityHeadRotation(npc, (byte) (npc.getBukkitYaw() * 256 / 360)));
DataWatcher watcher = npc.ai();
watcher.b(new DataWatcherObject<>(17, DataWatcherRegistry.a), (byte) 127);
pc.a(new PacketPlayOutEntityMetadata(npc.ae(), watcher, true));
Bukkit.getScheduler().runTaskLaterAsynchronously(main, () -> pc.a(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.e, npc)), 50);
ItemStack netheriteAxe = new ItemStack(Material.NETHERITE_AXE);
ItemStack anotherAxe = new ItemStack(Material.NETHERITE_INGOT);
List<Pair<EnumItemSlot, net.minecraft.world.item.ItemStack>> list = new ArrayList<>();
list.add(new Pair<>(EnumItemSlot.a, CraftItemStack.asNMSCopy(netheriteAxe)));
list.add(new Pair<>(EnumItemSlot.b, CraftItemStack.asNMSCopy(anotherAxe)));
pc.a(new PacketPlayOutEntityEquipment(npc.ae(), list));
}
}
public static void addJoinPacket(Player player) {
for(EntityPlayer npc : NPCs) {
CraftPlayer creaftPlayer = (CraftPlayer) player;
EntityPlayer sp = creaftPlayer.getHandle();
PlayerConnection pc = sp.b;
pc.a(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.a, npc));
pc.a(new PacketPlayOutNamedEntitySpawn(npc));
pc.a(new PacketPlayOutEntityHeadRotation(npc, (byte) (npc.getBukkitYaw() * 256 / 360)));
DataWatcher watcher = npc.ai();
watcher.b(new DataWatcherObject<>(17, DataWatcherRegistry.a), (byte) 127);
pc.a(new PacketPlayOutEntityMetadata(npc.ae(), watcher, true));
Bukkit.getScheduler().runTaskLaterAsynchronously(main, () -> pc.a(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.e, npc)), 50);
}
}
}

View file

@ -0,0 +1,49 @@
package me.night.nullvalkyrie.npc;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
import org.bukkit.entity.Player;
import java.io.InputStreamReader;
import java.net.URL;
public class Skin {
private String texture;
private String signature;
public Skin(String texture, String signature) {
this.texture = texture;
this.signature = signature;
}
public String getTexture() { return texture; }
public String getSignature() { return signature; }
public static String[] getSkin(String name) {
try {
URL url = new URL("https://api.mojang.com/users/profiles/minecraft/" + name);
InputStreamReader reader = new InputStreamReader(url.openStream());
String uuid = new JsonParser().parse(reader).getAsJsonObject().get("id").getAsString();
URL url2 = new URL("https://sessionserver.mojang.com/session/minecraft/profile/" + uuid + "?unsigned=false");
InputStreamReader reader2 = new InputStreamReader(url2.openStream());
JsonObject properties = new JsonParser().parse(reader2).getAsJsonObject().get("properties").getAsJsonArray().get(0).getAsJsonObject();
String texture = properties.get("value").getAsString();
String signature = properties.get("signature").getAsString();
return new String[] {texture, signature};
} catch (Exception e) {
return new String[]{};
}
}
public static String[] getSkin(Player player) {
try {
GameProfile profile = ((CraftPlayer) player).getProfile();
Property property = profile.getProperties().get("textures").iterator().next();
String texture = property.getValue();
String signature = property.getSignature();
return new String[]{texture, signature};
} catch (Exception e) {
return new String[]{};
}
}
}

View file

@ -1,6 +1,7 @@
package me.night.nullvalkyrie.rank;
import me.night.nullvalkyrie.Main;
import me.night.nullvalkyrie.npc.NPC;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
@ -17,8 +18,8 @@ public class ScoreboardListener implements Listener {
public static RankManager rankManager;
public static NameTagManager nameTagManager;
private SideBarManager sideBarManager;
private BelowNameManager belowNameManager;
private final SideBarManager sideBarManager;
private final BelowNameManager belowNameManager;
public ScoreboardListener(Main main) {
nameTagManager = new NameTagManager(main);
rankManager = new RankManager(main);
@ -41,6 +42,9 @@ public class ScoreboardListener implements Listener {
sideBarManager.start(player);
belowNameManager.setBelowName(player);
e.setJoinMessage(rankManager.getRank(e.getPlayer().getUniqueId()).getDisplay() + " " + e.getPlayer().getName() + ChatColor.WHITE + " joined the server!");
if(NPC.getNPCs() == null) return;
if(NPC.getNPCs().isEmpty()) return;
NPC.addJoinPacket(e.getPlayer());
}
@EventHandler