Compare commits
10 commits
ddd2786606
...
0368b5f86f
Author | SHA1 | Date | |
---|---|---|---|
|
0368b5f86f | ||
|
25dc5b03c8 | ||
|
472f77b9c4 | ||
|
66fef835eb | ||
|
ce5ad39302 | ||
|
6525ea9f65 | ||
|
b4212a26c1 | ||
|
e5cfb54f7b | ||
|
baf34db7ae | ||
|
85ccd11904 |
44 changed files with 1053 additions and 845 deletions
14
README.md
14
README.md
|
@ -1,6 +1,6 @@
|
||||||
# NullValkyrie
|
# NullValkyrie
|
||||||
|
|
||||||
Welcome to the NullValkyrie repository! This project is designed to a multipurpose plugin with a lot of cool features which most of the modern servers have.
|
NullValkyrie is multipurpose Minecraft plugin with a lot of features where most modern servers have.
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ Welcome to the NullValkyrie repository! This project is designed to a multipurpo
|
||||||
|
|
||||||
## Getting Started
|
## Getting Started
|
||||||
|
|
||||||
To get started with NullValkyrie, simply clone the repository and install the dependencies using Maven:
|
To get started with the project, simply clone the repository and install the dependencies using Maven:
|
||||||
|
|
||||||
```cmd
|
```cmd
|
||||||
git clone https://github.com/night0721/NullValkyrie.git
|
git clone https://github.com/night0721/NullValkyrie.git
|
||||||
|
@ -26,17 +26,13 @@ Then, you can add the plugin to your plugin folder and start the server to use i
|
||||||
|
|
||||||
## Support
|
## Support
|
||||||
|
|
||||||
If you need support, you can join the Discord server: https://discord.gg/qTfXU3yuuN or DM me on Discord: Ń1ght#4004
|
If you need support, you can join the [Discord server](https://discord.gg/SbQHChmGcp) or DM me on Discord: night.dev
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
NullValkyrie is licensed under the CC-BY-NC-SA-4.0. See [LICENSE](https://github.com/night0721/NullValkyrie/blob/master/LICENSE) for more information.
|
NullValkyrie is licensed under the GNU Public License v3.0. See [LICENSE](https://github.com/night0721/NullValkyrie/blob/master/LICENSE) for more information.
|
||||||
|
|
||||||
## Credits
|
|
||||||
|
|
||||||
- [night0721] - Discord: Ń1ght#4004
|
|
||||||
|
|
||||||
## Contribution
|
## Contribution
|
||||||
|
|
||||||
We welcome contributions to the NullValkyrie project! If you have any ideas for improvements or new features, please feel free to fork the project and create a pull request or open an issue.
|
If you have any ideas for improvements or new features, please feel free to fork the project and create a pull request or open an issue.
|
||||||
All contributions are welcome, including translations, documentation, and code.
|
All contributions are welcome, including translations, documentation, and code.
|
||||||
|
|
12
pom.xml
12
pom.xml
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
<groupId>me.night</groupId>
|
<groupId>me.night</groupId>
|
||||||
<artifactId>NullValkyrie</artifactId>
|
<artifactId>NullValkyrie</artifactId>
|
||||||
<version>1.1.02</version>
|
<version>1.1.1</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<name>NullValkyrie</name>
|
<name>NullValkyrie</name>
|
||||||
|
@ -67,9 +67,9 @@
|
||||||
</goals>
|
</goals>
|
||||||
<id>remap-obf</id>
|
<id>remap-obf</id>
|
||||||
<configuration>
|
<configuration>
|
||||||
<srgIn>org.spigotmc:minecraft-server:1.19.3-R0.1-SNAPSHOT:txt:maps-mojang</srgIn>
|
<srgIn>org.spigotmc:minecraft-server:1.19.2-R0.1-SNAPSHOT:txt:maps-mojang</srgIn>
|
||||||
<reverse>true</reverse>
|
<reverse>true</reverse>
|
||||||
<remappedDependencies>org.spigotmc:spigot:1.19.3-R0.1-SNAPSHOT:jar:remapped-mojang</remappedDependencies>
|
<remappedDependencies>org.spigotmc:spigot:1.19.2-R0.1-SNAPSHOT:jar:remapped-mojang</remappedDependencies>
|
||||||
<remappedArtifactAttached>true</remappedArtifactAttached>
|
<remappedArtifactAttached>true</remappedArtifactAttached>
|
||||||
<remappedClassifierName>remapped-obf</remappedClassifierName>
|
<remappedClassifierName>remapped-obf</remappedClassifierName>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
@ -82,8 +82,8 @@
|
||||||
<id>remap-spigot</id>
|
<id>remap-spigot</id>
|
||||||
<configuration>
|
<configuration>
|
||||||
<inputFile>${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar</inputFile>
|
<inputFile>${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar</inputFile>
|
||||||
<srgIn>org.spigotmc:minecraft-server:1.19.3-R0.1-SNAPSHOT:csrg:maps-spigot</srgIn>
|
<srgIn>org.spigotmc:minecraft-server:1.19.2-R0.1-SNAPSHOT:csrg:maps-spigot</srgIn>
|
||||||
<remappedDependencies>org.spigotmc:spigot:1.19.3-R0.1-SNAPSHOT:jar:remapped-obf</remappedDependencies>
|
<remappedDependencies>org.spigotmc:spigot:1.19.2-R0.1-SNAPSHOT:jar:remapped-obf</remappedDependencies>
|
||||||
</configuration>
|
</configuration>
|
||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
|
@ -115,7 +115,7 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.spigotmc</groupId>
|
<groupId>org.spigotmc</groupId>
|
||||||
<artifactId>spigot</artifactId>
|
<artifactId>spigot</artifactId>
|
||||||
<version>1.19.3-R0.1-SNAPSHOT</version>
|
<version>1.19.2-R0.1-SNAPSHOT</version>
|
||||||
<classifier>remapped-mojang</classifier>
|
<classifier>remapped-mojang</classifier>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
|
@ -1,100 +0,0 @@
|
||||||
A teleportation plugin that allows players to easily and quickly travel to different locations on the server.
|
|
||||||
A rewards system that gives players rewards for reaching certain milestones, such as reaching a certain level or completing specific tasks.
|
|
||||||
A custom enchantments plugin that allows players to add unique enchantments to their gear.
|
|
||||||
A custom crafting system that adds new recipes and allows players to create unique items.
|
|
||||||
A minigame plugin that adds fun, engaging minigames for players to enjoy.
|
|
||||||
A player-run economy plugin that allows players to trade and sell items with one another.
|
|
||||||
A chat enhancement plugin that adds fun emotes, chat formatting options, and other features to improve the chat experience.
|
|
||||||
A pet plugin that allows players to tame and care for their own pets.
|
|
||||||
A player-run shop plugin that allows players to create their own shops and sell items to other players.
|
|
||||||
A dungeon generator plugin that randomly generates challenging dungeon experiences for players to explore.
|
|
||||||
A chat enhancement plugin that allows players to use custom emotes and chat formatting.
|
|
||||||
A teleportation plugin that allows players to set and teleport to waypoints.
|
|
||||||
A death tracker plugin that keeps track of how many times a player has died and displays it in chat.
|
|
||||||
A farming plugin that makes it easier for players to plant and grow crops.
|
|
||||||
A minigame plugin that adds new games for players to play, such as parkour challenges or capture the flag.
|
|
||||||
A voting plugin that allows players to vote on different options, such as which game mode to play next or which map to use.
|
|
||||||
A recipe book plugin that allows players to access a comprehensive list of all the crafting recipes in the game.
|
|
||||||
An economy plugin that adds a virtual currency and trading system to the game, allowing players to buy and sell items with one another.
|
|
||||||
A permissions plugin that allows server administrators to manage player permissions and control who can do what on the server.
|
|
||||||
A game mode plugin that adds new game modes, such as creative mode or adventure mode, for players to choose from.
|
|
||||||
A dungeon generation plugin that automatically generates new dungeon structures for players to explore and conquer.
|
|
||||||
A parkour plugin that adds new parkour maps and challenges for players to complete.
|
|
||||||
A mob spawning control plugin that allows players to customize mob spawning behavior on the server.
|
|
||||||
A music plugin that allows players to play music in-game using note blocks.
|
|
||||||
A custom crafting plugin that allows players to create their own custom crafting recipes.
|
|
||||||
A loot table editor plugin that allows players to customize the loot that mobs drop when they are killed.
|
|
||||||
A scoreboard plugin that allows players to create and customize their own in-game scoreboard.
|
|
||||||
A grief prevention plugin that allows players to protect their builds from being destroyed by other players.
|
|
||||||
A teleport request plugin that allows players to request teleportations to other players and requires the other player to accept the request before the teleportation occurs.
|
|
||||||
A weather control plugin that allows players to change the weather on the server, such as making it rain or clearing up the skies.
|
|
||||||
A plugin that adds new types of blocks, items, or mobs to the game.
|
|
||||||
A plugin that allows players to create and customize their own in-game homes or shops.
|
|
||||||
A plugin that introduces a new type of game mechanic, such as a crafting system or a trading system.
|
|
||||||
A plugin that adds new mini-games or challenges for players to complete.
|
|
||||||
A plugin that allows players to use custom skins or textures for their characters.
|
|
||||||
A plugin that introduces a new level of difficulty for players to experience, such as a "hardcore" mode.
|
|
||||||
A plugin that adds new, themed environments for players to explore, such as a jungle or a desert.
|
|
||||||
A plugin that allows players to create and manage their own in-game economy, with the ability to buy and sell items with each other.
|
|
||||||
A plugin that introduces new forms of transportation, such as minecart rail networks or boats.
|
|
||||||
A plugin that allows players to create and customize their own in-game maps, which can be shared with other players.
|
|
||||||
A plugin that allows players to create and customize their own in-game characters, including appearance, abilities, and stats.
|
|
||||||
A plugin that introduces new forms of combat, such as ranged weapons or magic spells.
|
|
||||||
A plugin that adds new dungeons or boss battles for players to challenge.
|
|
||||||
A plugin that allows players to create and join different factions or clans, and compete against each other in in-game events or challenges.
|
|
||||||
A plugin that adds new biomes or dimensions for players to explore, such as a Nether or a End-like dimension.
|
|
||||||
A plugin that introduces new environmental hazards or challenges, such as weather effects or dangerous mobs.
|
|
||||||
A plugin that allows players to create and customize their own in-game weapons, armor, or tools.
|
|
||||||
A plugin that adds new types of crops, food, or farming tools for players to use.
|
|
||||||
A plugin that allows players to create and customize their own in-game quests or objectives, which can be shared with other players.
|
|
||||||
A plugin that introduces new forms of transportation, such as flying mounts or teleportation spells.
|
|
||||||
A plugin that adds new forms of currency, such as virtual coins or tokens, which players can earn and spend in-game.
|
|
||||||
A plugin that introduces new forms of resource gathering or processing, such as mining, smelting, or crafting.
|
|
||||||
A plugin that allows players to create and customize their own in-game shops or markets, where they can buy and sell items with each other.
|
|
||||||
A plugin that adds new challenges or events for players to participate in, such as races, tournaments, or scavenger hunts.
|
|
||||||
A plugin that allows players to create and customize their own in-game pets or companions, which can provide various benefits or abilities.
|
|
||||||
A plugin that adds new environmental effects, such as day/night cycles or changing seasons.
|
|
||||||
A plugin that allows players to create and customize their own in-game vehicles, such as cars, planes, or boats.
|
|
||||||
A plugin that introduces new forms of player-versus-player (PvP) combat, such as team battles or capture the flag.
|
|
||||||
A plugin that allows players to create and customize their own in-game skills or abilities, which can be leveled up and improved over time.
|
|
||||||
A plugin that adds new types of terrain or structures for players to explore, such as caves, ruins, or abandoned buildings.
|
|
||||||
A player teleportation plugin
|
|
||||||
A plugin that adds custom crafting recipes
|
|
||||||
A plugin that adds new types of enemies and boss battles
|
|
||||||
A plugin that allows players to create and join guilds
|
|
||||||
A plugin that adds new types of weapons and armor
|
|
||||||
A plugin that allows players to create and customize their own houses
|
|
||||||
A plugin that adds a quest and adventure system
|
|
||||||
A plugin that adds new types of biomes and dimensions
|
|
||||||
A plugin that allows players to ride and breed different types of horses
|
|
||||||
A plugin that adds new types of crops and plants for players to farm
|
|
||||||
A plugin that allows players to fish and cook different types of food
|
|
||||||
A plugin that adds new types of pets and companions for players to tame
|
|
||||||
A plugin that allows players to create and customize their own NPC characters
|
|
||||||
A plugin that adds new types of weather and environmental effects
|
|
||||||
A plugin that allows players to craft and use magic spells
|
|
||||||
A plugin that adds new types of transportation, such as minecarts or boats
|
|
||||||
A plugin that allows players to build and customize their own vehicles
|
|
||||||
A plugin that adds new types of trades and professions for players to pursue
|
|
||||||
A plugin that allows players to play mini-games and challenges with other players
|
|
||||||
A plugin that adds new types of items and resources for players to collect and use.
|
|
||||||
A plugin that adds a new type of energy system for players to manage and use
|
|
||||||
A plugin that allows players to build and customize their own multi-block structures
|
|
||||||
A plugin that adds new types of dimensions, each with their own unique features and challenges
|
|
||||||
A plugin that allows players to build and customize their own custom weapons and armor
|
|
||||||
A plugin that adds new types of resources, such as ores, gems, and fluids, that players can extract and use
|
|
||||||
A plugin that allows players to create and customize their own custom enchantments and potion effects
|
|
||||||
A plugin that adds new types of machines and technology for players to build and use
|
|
||||||
A plugin that allows players to create and customize their own custom items and blocks
|
|
||||||
A plugin that adds new types of hazards and challenges, such as natural disasters or enemy attacks, for players to face
|
|
||||||
A plugin that allows players to build and customize their own transportation networks, such as railways or highways
|
|
||||||
A plugin that adds new types of terrain and landscape features, such as caves, ravines, and mountains
|
|
||||||
A plugin that allows players to create and customize their own custom game modes and rules
|
|
||||||
A plugin that adds new types of interactive objects and mechanisms for players to use and explore
|
|
||||||
A plugin that allows players to build and customize their own custom AI entities, such as guards or pets
|
|
||||||
A plugin that adds new types of environmental effects and physics, such as dynamic lighting or water simulation
|
|
||||||
A plugin that allows players to create and customize their own custom dimension and world generation settings
|
|
||||||
A plugin that adds new types of resources and materials for players to collect and use in their builds
|
|
||||||
A plugin that allows players to create and customize their own custom multiplayer game modes and rules
|
|
||||||
A plugin that adds new types of challenges and rewards for players to earn and unlock
|
|
||||||
A plugin that allows players to create and customize their own custom adventure maps and scenarios.
|
|
|
@ -1,7 +1,8 @@
|
||||||
package me.night.nullvalkyrie;
|
package me.night.nullvalkyrie;
|
||||||
|
|
||||||
|
import me.night.nullvalkyrie.entities.miners.CryptoMiner;
|
||||||
import me.night.nullvalkyrie.events.listeners.*;
|
import me.night.nullvalkyrie.events.listeners.*;
|
||||||
import me.night.nullvalkyrie.tasks.AlwaysDayTask;
|
import me.night.nullvalkyrie.game.tasks.AlwaysDayTask;
|
||||||
import me.night.nullvalkyrie.ui.inventory.InventoryListener;
|
import me.night.nullvalkyrie.ui.inventory.InventoryListener;
|
||||||
import me.night.nullvalkyrie.database.NPCDataManager;
|
import me.night.nullvalkyrie.database.NPCDataManager;
|
||||||
import me.night.nullvalkyrie.discord.DiscordClientManager;
|
import me.night.nullvalkyrie.discord.DiscordClientManager;
|
||||||
|
@ -12,9 +13,7 @@ import me.night.nullvalkyrie.database.DatabaseManager;
|
||||||
import org.bukkit.*;
|
import org.bukkit.*;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
|
public final class NullValkyrie extends JavaPlugin {
|
||||||
public final class Main extends JavaPlugin {
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
EnchantmentManager.register();
|
EnchantmentManager.register();
|
||||||
|
@ -25,9 +24,25 @@ public final class Main extends JavaPlugin {
|
||||||
Bukkit.getPluginManager().registerEvents(new ScoreboardListener(), this);
|
Bukkit.getPluginManager().registerEvents(new ScoreboardListener(), this);
|
||||||
Bukkit.getPluginManager().registerEvents(new CustomItemEvents(), this);
|
Bukkit.getPluginManager().registerEvents(new CustomItemEvents(), this);
|
||||||
Bukkit.getPluginManager().registerEvents(new DamageEffectEvents(), this);
|
Bukkit.getPluginManager().registerEvents(new DamageEffectEvents(), this);
|
||||||
Bukkit.getPluginManager().registerEvents(new NPCEvents(), this);
|
Bukkit.getPluginManager().registerEvents(new CustomEvents(), this);
|
||||||
new DiscordClientManager();
|
new DiscordClientManager();
|
||||||
NPCDataManager.reloadNPC();
|
NPCDataManager.reloadNPC();
|
||||||
|
CryptoMiner.reloadMiner();
|
||||||
new AlwaysDayTask().runTaskTimer(this, 0, 100);
|
new AlwaysDayTask().runTaskTimer(this, 0, 100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// TODO: Add corpse body when player dies
|
||||||
|
// TODO: vault to store item
|
||||||
|
// TODO: withdraw command
|
||||||
|
// TODO: deposit command
|
||||||
|
// TODO: add more items using player heads, scraping textures from https://www.freshcoal.com/search.php
|
||||||
|
// TODO: custom recipes using exactChoice
|
||||||
|
// TODO: pets using player heads, giving abilities to player
|
||||||
|
// TODO: market command to show items a player is selling
|
||||||
|
// TODO: custom model data on block, such as mithril ore to mine
|
||||||
|
// TODO: skills and abilities system
|
||||||
|
// TODO: auto generated mobs in dungeons
|
||||||
|
// TODO: rewards when reached milestones, quests
|
||||||
|
// TODO: teleportation to different places, to different npcs, hub
|
||||||
|
// TODO: using pdc to store quests, skills, abilities, etc
|
||||||
|
// TODO: guilds
|
|
@ -1,10 +1,9 @@
|
||||||
package me.night.nullvalkyrie.commands;
|
package me.night.nullvalkyrie.commands;
|
||||||
|
|
||||||
import me.night.nullvalkyrie.entities.npcs.NPCManager;
|
|
||||||
import me.night.nullvalkyrie.entities.pets.ZombiePet;
|
import me.night.nullvalkyrie.entities.pets.ZombiePet;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.CraftWorld;
|
import org.bukkit.craftbukkit.v1_19_R1.CraftWorld;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
@ -34,7 +33,6 @@ public class BetaCommand extends Command {
|
||||||
itemMeta2.setCustomModelData(1010101);
|
itemMeta2.setCustomModelData(1010101);
|
||||||
item2.setItemMeta(itemMeta2);
|
item2.setItemMeta(itemMeta2);
|
||||||
player.getInventory().addItem(item2);
|
player.getInventory().addItem(item2);
|
||||||
NPCManager.createNPC(player, args[0]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,5 +18,6 @@ public class CommandManager {
|
||||||
new BetaCommand();
|
new BetaCommand();
|
||||||
new MinerCommand();
|
new MinerCommand();
|
||||||
new LuckyDrawCommand();
|
new LuckyDrawCommand();
|
||||||
|
new NPCCommand();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
package me.night.nullvalkyrie.commands;
|
package me.night.nullvalkyrie.commands;
|
||||||
|
|
||||||
|
import me.night.nullvalkyrie.entities.holograms.PerPlayerHologram;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.Location;
|
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.ArmorStand;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -16,16 +15,8 @@ public class HologramCommand extends Command {
|
||||||
@Override
|
@Override
|
||||||
public void onCommand(CommandSender sender, String[] args) {
|
public void onCommand(CommandSender sender, String[] args) {
|
||||||
if (sender instanceof Player player) {
|
if (sender instanceof Player player) {
|
||||||
String[] ar = new String[]{ChatColor.AQUA + "Hi", ChatColor.DARK_PURPLE + "What", ChatColor.GOLD + "Hello World"};
|
String[] ar = new String[]{ChatColor.AQUA + "Hi", ChatColor.DARK_PURPLE + "What", ChatColor.GOLD + "Hello World", ChatColor.GOLD + ChatColor.BOLD.toString() + "CLICK"};
|
||||||
Location location = player.getLocation();
|
new PerPlayerHologram(player, ar);
|
||||||
for (String line : ar) {
|
|
||||||
ArmorStand stand = location.getWorld().spawn(location.subtract(0, 0.3, 0), ArmorStand.class);
|
|
||||||
stand.setVisible(false);
|
|
||||||
stand.setGravity(false);
|
|
||||||
stand.setInvulnerable(true);
|
|
||||||
stand.setCustomNameVisible(true);
|
|
||||||
stand.setCustomName(line);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ package me.night.nullvalkyrie.commands;
|
||||||
|
|
||||||
import me.night.nullvalkyrie.database.MinerDataManager;
|
import me.night.nullvalkyrie.database.MinerDataManager;
|
||||||
import me.night.nullvalkyrie.entities.miners.CryptoMiner;
|
import me.night.nullvalkyrie.entities.miners.CryptoMiner;
|
||||||
import me.night.nullvalkyrie.enums.MinerType;
|
import me.night.nullvalkyrie.entities.miners.MinerType;
|
||||||
import me.night.nullvalkyrie.ui.inventory.Miner;
|
import me.night.nullvalkyrie.ui.inventory.Miner;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
|
@ -34,8 +34,8 @@ public class MinerCommand extends Command {
|
||||||
double rate = 0.4;
|
double rate = 0.4;
|
||||||
long time = System.currentTimeMillis();
|
long time = System.currentTimeMillis();
|
||||||
assert type != null;
|
assert type != null;
|
||||||
MinerDataManager.setMiner(name, type, level, rate, true, time);
|
MinerDataManager.setMiner(name, type, level, rate, true, time, player.getLocation());
|
||||||
CryptoMiner miner = new CryptoMiner(name, type, level, rate, time);
|
CryptoMiner miner = new CryptoMiner(name, type, level, rate, time, player.getLocation());
|
||||||
miner.spawn(player);
|
miner.spawn(player);
|
||||||
} else if (args[0].equalsIgnoreCase("claim")) {
|
} else if (args[0].equalsIgnoreCase("claim")) {
|
||||||
MinerDataManager.setLastClaim(args[1]);
|
MinerDataManager.setLastClaim(args[1]);
|
||||||
|
|
39
src/main/java/me/night/nullvalkyrie/commands/NPCCommand.java
Normal file
39
src/main/java/me/night/nullvalkyrie/commands/NPCCommand.java
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
package me.night.nullvalkyrie.commands;
|
||||||
|
|
||||||
|
import me.night.nullvalkyrie.entities.npcs.NPCManager;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.util.StringUtil;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class NPCCommand extends Command {
|
||||||
|
public NPCCommand() {
|
||||||
|
super("npc", new String[]{}, "NPCs", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCommand(CommandSender sender, String[] args) {
|
||||||
|
if (sender instanceof Player player) {
|
||||||
|
if (args.length == 0) {
|
||||||
|
player.sendMessage(ChatColor.RED + "Invalid command");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (args[0].equalsIgnoreCase("new")) {
|
||||||
|
NPCManager.createNPC(player, args[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> onTabComplete(CommandSender sender, String[] args) {
|
||||||
|
if (args.length == 1) {
|
||||||
|
List<String> cc = List.of("new", "list");
|
||||||
|
return StringUtil.copyPartialMatches(args[0], cc, new ArrayList<>());
|
||||||
|
}
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
package me.night.nullvalkyrie.commands;
|
package me.night.nullvalkyrie.commands;
|
||||||
|
|
||||||
import me.night.nullvalkyrie.database.RankDataManager;
|
import me.night.nullvalkyrie.database.RankDataManager;
|
||||||
import me.night.nullvalkyrie.enums.Rank;
|
import me.night.nullvalkyrie.util.Rank;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.OfflinePlayer;
|
import org.bukkit.OfflinePlayer;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package me.night.nullvalkyrie.commands;
|
package me.night.nullvalkyrie.commands;
|
||||||
|
|
||||||
import me.night.nullvalkyrie.Main;
|
import me.night.nullvalkyrie.NullValkyrie;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
|
@ -23,13 +23,13 @@ public class VanishCommand extends Command {
|
||||||
if (vanished.contains(player.getUniqueId())) {
|
if (vanished.contains(player.getUniqueId())) {
|
||||||
vanished.remove(player.getUniqueId());
|
vanished.remove(player.getUniqueId());
|
||||||
for (Player target : Bukkit.getOnlinePlayers()) {
|
for (Player target : Bukkit.getOnlinePlayers()) {
|
||||||
target.showPlayer(Main.getPlugin(Main.class), player);
|
target.showPlayer(NullValkyrie.getPlugin(NullValkyrie.class), player);
|
||||||
}
|
}
|
||||||
player.sendMessage(ChatColor.GREEN + "You are now seen by people");
|
player.sendMessage(ChatColor.GREEN + "You are now seen by people");
|
||||||
} else {
|
} else {
|
||||||
vanished.add(player.getUniqueId());
|
vanished.add(player.getUniqueId());
|
||||||
for (Player target : Bukkit.getOnlinePlayers()) {
|
for (Player target : Bukkit.getOnlinePlayers()) {
|
||||||
target.hidePlayer(Main.getPlugin(Main.class), player);
|
target.hidePlayer(NullValkyrie.getPlugin(NullValkyrie.class), player);
|
||||||
}
|
}
|
||||||
player.sendMessage(ChatColor.GREEN + "You are now vanished");
|
player.sendMessage(ChatColor.GREEN + "You are now vanished");
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,14 +2,16 @@ package me.night.nullvalkyrie.database;
|
||||||
|
|
||||||
import com.mongodb.client.MongoCursor;
|
import com.mongodb.client.MongoCursor;
|
||||||
import me.night.nullvalkyrie.entities.miners.CryptoMiner;
|
import me.night.nullvalkyrie.entities.miners.CryptoMiner;
|
||||||
import me.night.nullvalkyrie.enums.MinerType;
|
import me.night.nullvalkyrie.entities.miners.MinerType;
|
||||||
import org.bson.Document;
|
import org.bson.Document;
|
||||||
import org.bson.conversions.Bson;
|
import org.bson.conversions.Bson;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
public class MinerDataManager {
|
public class MinerDataManager {
|
||||||
public static void setMiner(String name, MinerType type, int level, double rate, boolean enabled, long lastclaim) {
|
public static void setMiner(String name, MinerType type, int level, double rate, boolean enabled, long lastclaim, Location location) {
|
||||||
Document newDocument = new Document();
|
Document newDocument = new Document();
|
||||||
newDocument.put("ID", new DatabaseManager().getMinersDB().countDocuments() + 1);
|
newDocument.put("ID", new DatabaseManager().getMinersDB().countDocuments() + 1);
|
||||||
newDocument.put("Name", name);
|
newDocument.put("Name", name);
|
||||||
|
@ -18,6 +20,9 @@ public class MinerDataManager {
|
||||||
newDocument.put("Rate", rate);
|
newDocument.put("Rate", rate);
|
||||||
newDocument.put("Enabled", enabled);
|
newDocument.put("Enabled", enabled);
|
||||||
newDocument.put("LastClaim", lastclaim);
|
newDocument.put("LastClaim", lastclaim);
|
||||||
|
newDocument.put("x", location.getX());
|
||||||
|
newDocument.put("y", location.getY());
|
||||||
|
newDocument.put("z", location.getZ());
|
||||||
new DatabaseManager().getMinersDB().insertOne(newDocument);
|
new DatabaseManager().getMinersDB().insertOne(newDocument);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,20 +45,12 @@ public class MinerDataManager {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static CryptoMiner getMiner(long id) {
|
|
||||||
Document doc = new DatabaseManager().getMinersDB().find(new Document("ID", id)).first();
|
|
||||||
if (doc != null) {
|
|
||||||
return new CryptoMiner(doc.getString("Name"), MinerType.getByName(doc.getString("Material")), doc.getInteger("Level"), doc.getDouble("Rate"), doc.getLong("LastClaim"));
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static HashMap<Long, CryptoMiner> getMiners() {
|
public static HashMap<Long, CryptoMiner> getMiners() {
|
||||||
HashMap<Long, CryptoMiner> list = new HashMap<>();
|
HashMap<Long, CryptoMiner> list = new HashMap<>();
|
||||||
try (MongoCursor<Document> cursor = new DatabaseManager().getMinersDB().find().cursor()) {
|
try (MongoCursor<Document> cursor = new DatabaseManager().getMinersDB().find().cursor()) {
|
||||||
while (cursor.hasNext()) {
|
while (cursor.hasNext()) {
|
||||||
Document doc = cursor.next();
|
Document doc = cursor.next();
|
||||||
list.put(doc.getLong("ID"), new CryptoMiner(doc.getString("Name"), MinerType.getByName(doc.getString("Material")), doc.getInteger("Level"), doc.getDouble("Rate"), doc.getLong("LastClaim")));
|
list.put(doc.getLong("ID"), new CryptoMiner(doc.getString("Name"), MinerType.getByName(doc.getString("Material")), doc.getInteger("Level"), doc.getDouble("Rate"), doc.getLong("LastClaim"), new Location(Bukkit.getWorld("world"), doc.getDouble("x"), doc.getDouble("y"), doc.getDouble("z"))));
|
||||||
}
|
}
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class NPCDataManager {
|
public class NPCDataManager {
|
||||||
public static void setNPC(String name, int x, int y, int z, int pitch, int yaw, String world, String texture, String signature) {
|
public static void setNPC(String name, double x, double y, double z, int pitch, int yaw, String world, String texture, String signature) {
|
||||||
Document document = new DatabaseManager().getNPCsDB().find(new Document("Name", name)).first();
|
Document document = new DatabaseManager().getNPCsDB().find(new Document("Name", name)).first();
|
||||||
if (document != null) {
|
if (document != null) {
|
||||||
System.out.println("A NPC with this name already exist");
|
System.out.println("A NPC with this name already exist");
|
||||||
|
@ -36,9 +36,9 @@ public class NPCDataManager {
|
||||||
Document document = cursor.next();
|
Document document = cursor.next();
|
||||||
HashMap<String, Object> npc = new HashMap<>();
|
HashMap<String, Object> npc = new HashMap<>();
|
||||||
String name = document.getString("Name");
|
String name = document.getString("Name");
|
||||||
int x = document.getInteger("x");
|
double x = document.getDouble("x");
|
||||||
int y = document.getInteger("y");
|
double y = document.getDouble("y");
|
||||||
int z = document.getInteger("z");
|
double z = document.getDouble("z");
|
||||||
int pitch = document.getInteger("pitch");
|
int pitch = document.getInteger("pitch");
|
||||||
int yaw = document.getInteger("yaw");
|
int yaw = document.getInteger("yaw");
|
||||||
String world = document.getString("world");
|
String world = document.getString("world");
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package me.night.nullvalkyrie.database;
|
package me.night.nullvalkyrie.database;
|
||||||
|
|
||||||
import com.mongodb.client.MongoCursor;
|
import com.mongodb.client.MongoCursor;
|
||||||
import me.night.nullvalkyrie.enums.Rank;
|
import me.night.nullvalkyrie.util.Rank;
|
||||||
import me.night.nullvalkyrie.ui.player.ScoreboardListener;
|
import me.night.nullvalkyrie.ui.player.ScoreboardListener;
|
||||||
import org.bson.Document;
|
import org.bson.Document;
|
||||||
import org.bson.conversions.Bson;
|
import org.bson.conversions.Bson;
|
||||||
|
|
|
@ -8,27 +8,39 @@ import net.minecraft.network.syncher.EntityDataSerializers;
|
||||||
import net.minecraft.network.syncher.SynchedEntityData;
|
import net.minecraft.network.syncher.SynchedEntityData;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
import net.minecraft.world.entity.decoration.ArmorStand;
|
import net.minecraft.world.entity.decoration.ArmorStand;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
|
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
public class PerPlayerHologram {
|
public class PerPlayerHologram {
|
||||||
|
public static HashMap<Integer, ArmorStand[]> holograms = new HashMap<>();
|
||||||
|
|
||||||
public PerPlayerHologram(Player player, String[] lines) {
|
public PerPlayerHologram(Player player, String[] lines) {
|
||||||
double c = (lines.length) * 0.3 - 0.15;
|
spawnLine(player, lines);
|
||||||
for (String line : lines) {
|
|
||||||
spawnLine(player.getLocation().getY() + c, player, line);
|
|
||||||
c -= 0.3;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
private void spawnLine(double y, Player player, String line) {
|
private void spawnLine(Player player, String[] lines) {
|
||||||
|
double c = (lines.length) * 0.3 - 0.8;
|
||||||
|
ArmorStand[] stands = new ArmorStand[lines.length];
|
||||||
|
for (int i = 0; i < lines.length; i++) {
|
||||||
ServerPlayer p = ((CraftPlayer) player).getHandle();
|
ServerPlayer p = ((CraftPlayer) player).getHandle();
|
||||||
ArmorStand stand = new ArmorStand(p.level, player.getLocation().getX(), y, player.getLocation().getZ());
|
ArmorStand stand = new ArmorStand(p.getLevel(), player.getLocation().getX(), player.getLocation().getY() + c, player.getLocation().getZ());
|
||||||
stand.setInvisible(true);
|
stand.setInvisible(true);
|
||||||
new PacketPlayOutSpawnEntity(player, stand);
|
new PacketPlayOutSpawnEntity(player, stand);
|
||||||
|
stands[i] = stand;
|
||||||
SynchedEntityData watcher = stand.getEntityData();
|
SynchedEntityData watcher = stand.getEntityData();
|
||||||
watcher.set(new EntityDataAccessor<>(2, EntityDataSerializers.OPTIONAL_COMPONENT), Optional.of(Component.nullToEmpty(line)));
|
watcher.set(new EntityDataAccessor<>(2, EntityDataSerializers.OPTIONAL_COMPONENT), Optional.of(Component.nullToEmpty(lines[i])));
|
||||||
watcher.set(new EntityDataAccessor<>(3, EntityDataSerializers.BOOLEAN), true);
|
watcher.set(new EntityDataAccessor<>(3, EntityDataSerializers.BOOLEAN), true);
|
||||||
new PacketPlayOutEntityMetadata(player, stand, watcher.getNonDefaultValues());
|
new PacketPlayOutEntityMetadata(player, stand, watcher);
|
||||||
|
c -= 0.3;
|
||||||
|
if (lines.length == i + 1)
|
||||||
|
holograms.put(stand.getBukkitEntity().getEntityId(), stands);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HashMap<Integer, ArmorStand[]> getHolograms() {
|
||||||
|
return holograms;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
package me.night.nullvalkyrie.entities.items;
|
package me.night.nullvalkyrie.entities.items;
|
||||||
|
|
||||||
import me.night.nullvalkyrie.Main;
|
import me.night.nullvalkyrie.NullValkyrie;
|
||||||
import me.night.nullvalkyrie.database.CustomWeaponsDataManager;
|
import me.night.nullvalkyrie.database.CustomWeaponsDataManager;
|
||||||
import me.night.nullvalkyrie.enums.Rarity;
|
import me.night.nullvalkyrie.entities.miners.Rarity;
|
||||||
import me.night.nullvalkyrie.util.Util;
|
import me.night.nullvalkyrie.util.Util;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
|
@ -84,7 +84,7 @@ public class CustomItemManager {
|
||||||
HashMap<String, Object> pdcdata = (HashMap<String, Object>) weapon.get("PDC");
|
HashMap<String, Object> pdcdata = (HashMap<String, Object>) weapon.get("PDC");
|
||||||
for (String key : pdcdata.keySet()) {
|
for (String key : pdcdata.keySet()) {
|
||||||
PersistentDataContainer container = itemMeta.getPersistentDataContainer();
|
PersistentDataContainer container = itemMeta.getPersistentDataContainer();
|
||||||
NamespacedKey key1 = new NamespacedKey(Main.getPlugin(Main.class), key);
|
NamespacedKey key1 = new NamespacedKey(NullValkyrie.getPlugin(NullValkyrie.class), key);
|
||||||
keys.put(Rarity.getRarity((String) weapon.get("Rarity")).getColor() + weapon.get("Name") + "." + key, key1);
|
keys.put(Rarity.getRarity((String) weapon.get("Rarity")).getColor() + weapon.get("Name") + "." + key, key1);
|
||||||
container.set(key1, PersistentDataType.INTEGER, (int) pdcdata.get(key));
|
container.set(key1, PersistentDataType.INTEGER, (int) pdcdata.get(key));
|
||||||
}
|
}
|
||||||
|
@ -103,7 +103,7 @@ public class CustomItemManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setItemRecipe(String key, ItemStack i, List<String> shapes, HashMap<Character, Material> ingredients, int amount) {
|
public static void setItemRecipe(String key, ItemStack i, List<String> shapes, HashMap<Character, Material> ingredients, int amount) {
|
||||||
NamespacedKey nsk = new NamespacedKey(Main.getPlugin(Main.class), key.replaceAll("\\s", ""));
|
NamespacedKey nsk = new NamespacedKey(NullValkyrie.getPlugin(NullValkyrie.class), key.replaceAll("\\s", ""));
|
||||||
ShapedRecipe recipe = new ShapedRecipe(nsk, i);
|
ShapedRecipe recipe = new ShapedRecipe(nsk, i);
|
||||||
recipe.shape(shapes.get(0), shapes.get(1), shapes.get(2));
|
recipe.shape(shapes.get(0), shapes.get(1), shapes.get(2));
|
||||||
List<Character> abcs = List.of('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I');
|
List<Character> abcs = List.of('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I');
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package me.night.nullvalkyrie.enums;
|
package me.night.nullvalkyrie.entities.items;
|
||||||
|
|
||||||
|
import me.night.nullvalkyrie.entities.miners.Rarity;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
|
|
||||||
public enum Items {
|
public enum Items {
|
|
@ -2,45 +2,62 @@ package me.night.nullvalkyrie.entities.miners;
|
||||||
|
|
||||||
import com.mojang.authlib.GameProfile;
|
import com.mojang.authlib.GameProfile;
|
||||||
import com.mojang.authlib.properties.Property;
|
import com.mojang.authlib.properties.Property;
|
||||||
|
import com.mojang.datafixers.util.Pair;
|
||||||
import me.night.nullvalkyrie.enums.MinerType;
|
import me.night.nullvalkyrie.NullValkyrie;
|
||||||
import me.night.nullvalkyrie.util.Skin;
|
import me.night.nullvalkyrie.database.MinerDataManager;
|
||||||
|
import me.night.nullvalkyrie.packets.protocol.PacketPlayOutEntityMetadata;
|
||||||
import me.night.nullvalkyrie.util.Util;
|
import me.night.nullvalkyrie.util.Util;
|
||||||
|
import net.minecraft.network.protocol.game.ClientboundAddEntityPacket;
|
||||||
|
import net.minecraft.network.protocol.game.ClientboundPlayerInfoPacket;
|
||||||
|
import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket;
|
||||||
|
import net.minecraft.network.syncher.EntityDataAccessor;
|
||||||
|
import net.minecraft.network.syncher.EntityDataSerializers;
|
||||||
|
import net.minecraft.network.syncher.SynchedEntityData;
|
||||||
import net.minecraft.server.MinecraftServer;
|
import net.minecraft.server.MinecraftServer;
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
import org.apache.commons.codec.binary.Base64;
|
import net.minecraft.server.network.ServerGamePacketListenerImpl;
|
||||||
|
import net.minecraft.world.entity.EquipmentSlot;
|
||||||
|
import net.minecraft.world.entity.decoration.ArmorStand;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.World;
|
import org.bukkit.craftbukkit.v1_19_R1.CraftServer;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
|
import org.bukkit.craftbukkit.v1_19_R1.CraftWorld;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.CraftWorld;
|
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
|
||||||
import org.bukkit.entity.ArmorStand;
|
import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.meta.LeatherArmorMeta;
|
import org.bukkit.inventory.meta.LeatherArmorMeta;
|
||||||
import org.bukkit.inventory.meta.SkullMeta;
|
import org.bukkit.inventory.meta.SkullMeta;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
|
|
||||||
public class CryptoMiner {
|
public class CryptoMiner {
|
||||||
protected String name;
|
protected String name;
|
||||||
protected MinerType type;
|
protected MinerType type;
|
||||||
protected int level;
|
protected int level;
|
||||||
protected double rate;
|
protected double rate;
|
||||||
protected final long lastclaim;
|
protected final long lastclaim;
|
||||||
|
protected final double x;
|
||||||
|
protected final double y;
|
||||||
|
protected final double z;
|
||||||
|
protected final Location location;
|
||||||
|
|
||||||
public CryptoMiner(String name, MinerType type, int level, double rate, long lastclaim) {
|
public CryptoMiner(String name, MinerType type, int level, double rate, long lastclaim, Location location) {
|
||||||
this.name = name; // Name of the miner
|
this.name = name; // Name of the miner
|
||||||
this.type = type; // Type of the miner
|
this.type = type; // Type of the miner
|
||||||
this.level = level;
|
this.level = level;
|
||||||
this.rate = rate; // Percentage generate chance in each tick 20tick per sec
|
this.rate = rate; // Percentage generate chance in each tick 20tick per sec
|
||||||
this.lastclaim = lastclaim;
|
this.lastclaim = lastclaim;
|
||||||
|
this.x = location.getX();
|
||||||
|
this.y = location.getY();
|
||||||
|
this.z = location.getZ();
|
||||||
|
this.location = location;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
|
@ -55,16 +72,12 @@ public class CryptoMiner {
|
||||||
return rate;
|
return rate;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRate(double rate) {
|
|
||||||
this.rate = rate;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Material getType() {
|
public Material getType() {
|
||||||
return this.type.getMaterial();
|
return this.type.getMaterial();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setType(MinerType type) {
|
public MinerType getMinerType() {
|
||||||
this.type = type;
|
return this.type;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getLevel() {
|
public int getLevel() {
|
||||||
|
@ -79,6 +92,10 @@ public class CryptoMiner {
|
||||||
return lastclaim;
|
return lastclaim;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Location getLocation() {
|
||||||
|
return location;
|
||||||
|
}
|
||||||
|
|
||||||
public static void generate(int pp, int times) {
|
public static void generate(int pp, int times) {
|
||||||
int generated = 0;
|
int generated = 0;
|
||||||
for (int counter = 0; counter < times; counter++) {
|
for (int counter = 0; counter < times; counter++) {
|
||||||
|
@ -87,29 +104,21 @@ public class CryptoMiner {
|
||||||
}
|
}
|
||||||
System.out.println(generated);
|
System.out.println(generated);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void spawn(Player player) {
|
public void spawn(Player player) {
|
||||||
Location loc = player.getLocation().getWorld().getBlockAt(player.getLocation()).getLocation().add(0.5, 0, 0.5);
|
ArmorStand stand = new ArmorStand(((CraftWorld) this.getLocation().getWorld()).getHandle(), this.getLocation().getX() + 0.5, this.getLocation().getY(), this.getLocation().getZ() + 0.5);
|
||||||
if (player.getLocation().getWorld() == null) return;
|
stand.setInvulnerable(true);
|
||||||
ArmorStand stand = player.getLocation().getWorld().spawn(loc, ArmorStand.class);
|
|
||||||
stand.setGravity(false);
|
|
||||||
stand.setBasePlate(false);
|
|
||||||
stand.setSmall(true);
|
|
||||||
stand.setArms(true);
|
|
||||||
stand.setVisible(true);
|
|
||||||
ItemStack head = new ItemStack(Material.PLAYER_HEAD, 1);
|
ItemStack head = new ItemStack(Material.PLAYER_HEAD, 1);
|
||||||
SkullMeta meta = (SkullMeta) head.getItemMeta();
|
SkullMeta meta = (SkullMeta) head.getItemMeta();
|
||||||
if (meta == null) return;
|
if (meta == null) return;
|
||||||
GameProfile profile = new GameProfile(UUID.randomUUID(), null);
|
GameProfile profile = new GameProfile(UUID.randomUUID(), null);
|
||||||
byte[] encodedData = Base64.encodeBase64(String.format("{textures:{SKIN:{url:\"%s\"}}}", this.type.getHeadTexture()).getBytes());
|
// url method: new String(Base64.encodeBase64(String.format("{textures:{SKIN:{url:\"%s\"}}}", this.getMinerType().getHeadTexture()).getBytes()));
|
||||||
profile.getProperties().put("textures", new Property("textures", new String(encodedData)));
|
profile.getProperties().put("textures", new Property("textures", this.getMinerType().getHeadTexture()));
|
||||||
try {
|
try {
|
||||||
Util.setFieldValue(meta, "profile", profile);
|
Util.setFieldValue(meta, "profile", profile);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
head.setItemMeta(meta);
|
head.setItemMeta(meta);
|
||||||
|
|
||||||
ItemStack chest = new ItemStack(Material.LEATHER_CHESTPLATE);
|
ItemStack chest = new ItemStack(Material.LEATHER_CHESTPLATE);
|
||||||
LeatherArmorMeta chestdata = (LeatherArmorMeta) chest.getItemMeta();
|
LeatherArmorMeta chestdata = (LeatherArmorMeta) chest.getItemMeta();
|
||||||
if (chestdata == null) return;
|
if (chestdata == null) return;
|
||||||
|
@ -126,107 +135,73 @@ public class CryptoMiner {
|
||||||
bootdata.setColor(org.bukkit.Color.fromRGB(2, 2, 58));
|
bootdata.setColor(org.bukkit.Color.fromRGB(2, 2, 58));
|
||||||
boot.setItemMeta(bootdata);
|
boot.setItemMeta(bootdata);
|
||||||
ItemStack pick = new ItemStack(Material.GOLDEN_PICKAXE);
|
ItemStack pick = new ItemStack(Material.GOLDEN_PICKAXE);
|
||||||
stand.getEquipment().setItemInMainHand(pick);
|
List<Pair<EquipmentSlot, net.minecraft.world.item.ItemStack>> list = new ArrayList<>();
|
||||||
stand.getEquipment().setHelmet(head);
|
list.add(new Pair<>(EquipmentSlot.HEAD, CraftItemStack.asNMSCopy(head)));
|
||||||
stand.getEquipment().setChestplate(chest);
|
list.add(new Pair<>(EquipmentSlot.CHEST, CraftItemStack.asNMSCopy(chest)));
|
||||||
stand.getEquipment().setLeggings(leg);
|
list.add(new Pair<>(EquipmentSlot.LEGS, CraftItemStack.asNMSCopy(leg)));
|
||||||
stand.getEquipment().setBoots(boot);
|
list.add(new Pair<>(EquipmentSlot.FEET, CraftItemStack.asNMSCopy(boot)));
|
||||||
|
list.add(new Pair<>(EquipmentSlot.MAINHAND, CraftItemStack.asNMSCopy(pick)));
|
||||||
|
|
||||||
GameProfile gameProfile = new GameProfile(UUID.randomUUID(), Util.color(this.name));
|
GameProfile gameProfile = new GameProfile(UUID.randomUUID(), Util.color(this.name));
|
||||||
String[] skin = Skin.getSkin("Shiba_");
|
gameProfile.getProperties().put("textures", new Property("textures", this.type.getHeadTexture()));
|
||||||
gameProfile.getProperties().put("textures", new Property("textures", skin[0], skin[1]));
|
|
||||||
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
|
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
|
||||||
ServerLevel w = ((CraftWorld) player.getLocation().getWorld()).getHandle();
|
ServerLevel w = ((CraftWorld) player.getLocation().getWorld()).getHandle();
|
||||||
ServerPlayer miner = new ServerPlayer(server, w, gameProfile);
|
ServerPlayer m = new ServerPlayer(server, w, gameProfile, null);
|
||||||
World world = miner.getBukkitEntity().getWorld();
|
ServerGamePacketListenerImpl pc = ((CraftPlayer) player).getHandle().connection;
|
||||||
|
pc.send(new ClientboundAddEntityPacket(stand));
|
||||||
|
pc.send(new ClientboundSetEquipmentPacket(stand.getId(), list));
|
||||||
|
pc.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, m));
|
||||||
|
SynchedEntityData watcher = stand.getEntityData();
|
||||||
|
watcher.set(new EntityDataAccessor<>(0, EntityDataSerializers.BYTE), (byte) 20);
|
||||||
|
watcher.set(new EntityDataAccessor<>(5, EntityDataSerializers.BOOLEAN), true);
|
||||||
|
watcher.set(new EntityDataAccessor<>(15, EntityDataSerializers.BYTE), (byte) 13);
|
||||||
|
new PacketPlayOutEntityMetadata(player, stand, watcher);
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
generate();
|
||||||
|
}
|
||||||
|
}.runTaskTimer(NullValkyrie.getPlugin(NullValkyrie.class), 0, 40);
|
||||||
|
}
|
||||||
|
public void generate() {
|
||||||
List<Location> locs = new ArrayList<>();
|
List<Location> locs = new ArrayList<>();
|
||||||
for (int x = (int) stand.getLocation().getX() - 3; x <= stand.getLocation().getX() + 2; x++) {
|
for (int x = (int) this.getLocation().getX() - 2; x <= this.getLocation().getX() + 2; x++) {
|
||||||
for (int z = (int) stand.getLocation().getZ() - 2; z <= stand.getLocation().getZ() + 2; z++) {
|
for (int z = (int) this.getLocation().getZ() - 2; z <= this.getLocation().getZ() + 2; z++) {
|
||||||
for (int y = (int) stand.getLocation().getY() - 1; y <= stand.getLocation().getY() - 1; y++) {
|
for (int y = (int) this.getLocation().getY() - 1; y <= this.getLocation().getY() - 1; y++) {
|
||||||
if (world.getBlockAt(x, y, z).getType() == this.getType())
|
this.getLocation().setY(17.0F);
|
||||||
locs.add(world.getBlockAt(x, y, z).getLocation());
|
if (this.getLocation().getWorld().getBlockAt(x, y, z).getType() == this.getType()) {
|
||||||
|
locs.add(this.getLocation().getWorld().getBlockAt(x, y, z).getLocation());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
locs.remove(world.getBlockAt(stand.getLocation().subtract(0, -1, 0)).getLocation());
|
|
||||||
if (locs.size() != 0) {
|
if (locs.size() != 0) {
|
||||||
Location closest = locs.get(0);
|
Location closest = locs.get(0);
|
||||||
for (Location location : locs)
|
for (Location location : locs)
|
||||||
if (location.distance(stand.getLocation()) < closest.distance(stand.getLocation())) closest = location;
|
if (location.distance(this.getLocation()) < closest.distance(this.getLocation()))
|
||||||
|
closest = location;
|
||||||
ArrayList<ItemStack> items = new ArrayList<>();
|
ArrayList<ItemStack> items = new ArrayList<>();
|
||||||
ThreadLocalRandom random = ThreadLocalRandom.current();
|
ThreadLocalRandom random = ThreadLocalRandom.current();
|
||||||
if (closest.getBlock().getType() == this.getType()) {
|
|
||||||
closest.getBlock().getDrops().clear();
|
closest.getBlock().getDrops().clear();
|
||||||
int lower = 0;
|
List<int[]> levels = List.of(new int[]{1, 3}, new int[]{2, 5}, new int[]{3, 7}, new int[]{4, 9}, new int[]{5, 11}, new int[]{6, 13}, new int[]{7, 15}, new int[]{8, 17}, new int[]{9, 19}, new int[]{10, 21}, new int[]{11, 23}, new int[]{12, 25}, new int[]{13, 27}, new int[]{14, 29}, new int[]{15, 31}, new int[]{16, 33}, new int[]{17, 35}, new int[]{18, 37}, new int[]{19, 39}, new int[]{20, 41}, new int[]{21, 43}, new int[]{22, 45}, new int[]{23, 47}, new int[]{24, 49}, new int[]{25, 51}, new int[]{26, 53}, new int[]{27, 55}, new int[]{28, 57}, new int[]{29, 59}, new int[]{30, 61}, new int[]{31, 63}, new int[]{32, 65}, new int[]{33, 67}, new int[]{34, 69}, new int[]{35, 71}, new int[]{36, 73}, new int[]{37, 75}, new int[]{38, 77}, new int[]{39, 79}, new int[]{40, 81}, new int[]{41, 83}, new int[]{42, 85}, new int[]{43, 87}, new int[]{44, 89}, new int[]{45, 91}, new int[]{46, 93}, new int[]{47, 95}, new int[]{48, 97}, new int[]{49, 99}, new int[]{50, 100});
|
||||||
int upper = 0;
|
items.add(new ItemStack(this.getType(), random.nextInt(levels.get(this.getLevel())[0], levels.get(this.getLevel())[1])));
|
||||||
if (this.level == 1) {
|
|
||||||
lower = 1;
|
|
||||||
upper = 3;
|
|
||||||
} else if (this.level == 2) {
|
|
||||||
lower = 2;
|
|
||||||
upper = 5;
|
|
||||||
} else if (this.level == 3) {
|
|
||||||
lower = 3;
|
|
||||||
upper = 7;
|
|
||||||
} else if (this.level == 4) {
|
|
||||||
lower = 4;
|
|
||||||
upper = 9;
|
|
||||||
} else if (this.level == 5) {
|
|
||||||
lower = 5;
|
|
||||||
upper = 11;
|
|
||||||
} else if (this.level == 6) {
|
|
||||||
lower = 6;
|
|
||||||
upper = 13;
|
|
||||||
} else if (this.level == 7) {
|
|
||||||
lower = 7;
|
|
||||||
upper = 15;
|
|
||||||
} else if (this.level == 8) {
|
|
||||||
lower = 8;
|
|
||||||
upper = 17;
|
|
||||||
} else if (this.level == 9) {
|
|
||||||
lower = 9;
|
|
||||||
upper = 19;
|
|
||||||
} else if (this.level == 10) {
|
|
||||||
lower = 10;
|
|
||||||
upper = 21;
|
|
||||||
} else if (this.level == 11) {
|
|
||||||
lower = 11;
|
|
||||||
upper = 23;
|
|
||||||
} else if (this.level == 12) {
|
|
||||||
lower = 12;
|
|
||||||
upper = 25;
|
|
||||||
} else if (this.level == 13) {
|
|
||||||
lower = 13;
|
|
||||||
upper = 27;
|
|
||||||
} else if (this.level == 14) {
|
|
||||||
lower = 14;
|
|
||||||
upper = 29;
|
|
||||||
} else if (this.level == 15) {
|
|
||||||
lower = 15;
|
|
||||||
upper = 31;
|
|
||||||
} else if (this.level == 16) {
|
|
||||||
lower = 16;
|
|
||||||
upper = 33;
|
|
||||||
} else if (this.level == 17) {
|
|
||||||
lower = 17;
|
|
||||||
upper = 35;
|
|
||||||
} else if (this.level == 18) {
|
|
||||||
lower = 18;
|
|
||||||
upper = 37;
|
|
||||||
} else if (this.level == 19) {
|
|
||||||
lower = 19;
|
|
||||||
upper = 39;
|
|
||||||
} else if (this.level == 20) {
|
|
||||||
lower = 20;
|
|
||||||
upper = 41;
|
|
||||||
}
|
|
||||||
items.add(new ItemStack(this.getType(), random.nextInt(lower, upper)));
|
|
||||||
closest.getBlock().setType(Material.AIR);
|
closest.getBlock().setType(Material.AIR);
|
||||||
}
|
|
||||||
// drop the items
|
// drop the items
|
||||||
for (ItemStack item : items) {
|
for (ItemStack item : items) {
|
||||||
world.dropItemNaturally(closest, item);
|
this.getLocation().add(0, 2, 0).getWorld().dropItemNaturally(closest, item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static void reloadMiner() {
|
||||||
|
for (Player player : Bukkit.getOnlinePlayers())
|
||||||
|
for (CryptoMiner miner : MinerDataManager.getMiners().values()) {
|
||||||
|
miner.spawn(player);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void onJoin(Player player) {
|
||||||
|
for (CryptoMiner miner : MinerDataManager.getMiners().values()) {
|
||||||
|
miner.spawn(player);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
package me.night.nullvalkyrie.entities.miners;
|
||||||
|
|
||||||
|
import org.bukkit.Material;
|
||||||
|
public enum MinerType {
|
||||||
|
DIAMOND("Diamond", Material.DIAMOND_ORE, "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOWM4Y2E2NjRmMDZkNDE0NjUwYWFjNWNkNDgyYzNiMGM3OWE2NjFiNWYxMWRjODUyMTQyNWJhNmU1NjllNSJ9fX0="),
|
||||||
|
EMERALD("Emerald", Material.EMERALD_ORE, "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjRmNzNlMmVjZGMxYTM5MzlmYzEyZWY1N2Q3MTA0YTcwYzAyOGM1Y2ZiNzMyNGQ2OGVkM2IxZTIwYTkxMGEzIn19fQ=="),
|
||||||
|
GOLD("Gold", Material.GOLD_ORE, "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDcxNDlmYjllNjM4NTI2OGY1MTk4N2IyZGU1MjVmNTkwNTFiNjE3Njc2Mjc2ZDI1YzZiMjQ1Y2E4ZDRkNCJ9fX0="),
|
||||||
|
IRON("Iron", Material.IRON_ORE, "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGMzMTc1M2QzNDQwYjJhN2QxMTVmNmE3NTQyY2Q0YjI0ODdjYjdhZGEwYzk0NWJlNGQ0ZGY2MmJiMzlkNDA2NyJ9fX0="),
|
||||||
|
REDSTONE("Redstone", Material.REDSTONE_ORE, "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzU1YjcwZWEyM2VmNjFkNjE4N2U1NTgzMTI4MTU2ZTE2MDg2YzIyODM4YjQ4YTc2YTk5NWZiZjk4ZjFlYjhhIn19fQ=="),
|
||||||
|
COAL("Coal", Material.COAL_ORE, "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmM2ZDBkYWQ4NmRjZDNkN2JjNDIxYTNjMjIyYWJhMzQxNDRjOTc5MWRkMmZjYTZiNzZlMzYwMmE2ZTM2In19fQ=="),
|
||||||
|
LAPIS("Lapis", Material.LAPIS_ORE, "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGI4M2QyMjkzYTVjYjVlOGE5YTY4M2JiOWYxYzI2NzAzZjdjMDNmMzE0Mzk2MTEzYjA3MzQ5Njk5YTNjOGIifX19"),
|
||||||
|
QUARTZ("Quartz", Material.NETHER_QUARTZ_ORE, "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTQ1MjVhNTE2YTg3YTMxNTdlMTE2MzlhZWJiYzRjMmRmMmRiMTFkNTNjZWQ3NjgxMzQ0MzA0NmVkM2U1YiJ9fX0="),
|
||||||
|
OBSIDIAN("Obsidian", Material.OBSIDIAN, "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDY1YmIxOTJhNjU2YmQ2ZGVjOGQ4YzhlNGRiM2I1NzNjZjcxNjliYjczOTM5MTZlZjlhYzE5ZGExNjNhZGE1In19fQ=="),
|
||||||
|
NETHERITE("Netherite", Material.ANCIENT_DEBRIS, "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDM1NzQ0NGFkZTY0ZWM2Y2VhNjQ1ZWM1N2U3NzU4NjRkNjdjNWZhNjIyOTk3ODZlMDM3OTkzMTdlZTRhZCJ9fX0=");
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
private final Material material;
|
||||||
|
private final String headTexture;
|
||||||
|
MinerType(String name, Material material, String headTexture) {
|
||||||
|
this.name = name;
|
||||||
|
this.material = material;
|
||||||
|
this.headTexture = headTexture;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Material getMaterial() {
|
||||||
|
return material;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHeadTexture() {
|
||||||
|
return headTexture;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static MinerType getByName(String name) {
|
||||||
|
for (MinerType type : MinerType.values()) {
|
||||||
|
if (type.getName().equalsIgnoreCase(name)) {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package me.night.nullvalkyrie.enums;
|
package me.night.nullvalkyrie.entities.miners;
|
||||||
|
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
|
|
|
@ -3,9 +3,9 @@ package me.night.nullvalkyrie.entities.npcs;
|
||||||
import com.mojang.authlib.GameProfile;
|
import com.mojang.authlib.GameProfile;
|
||||||
import com.mojang.authlib.properties.Property;
|
import com.mojang.authlib.properties.Property;
|
||||||
import com.mojang.datafixers.util.Pair;
|
import com.mojang.datafixers.util.Pair;
|
||||||
|
import me.night.nullvalkyrie.NullValkyrie;
|
||||||
import me.night.nullvalkyrie.database.NPCDataManager;
|
import me.night.nullvalkyrie.database.NPCDataManager;
|
||||||
import me.night.nullvalkyrie.packets.protocol.PacketPlayOutEntityMetadata;
|
import me.night.nullvalkyrie.packets.protocol.PacketPlayOutEntityMetadata;
|
||||||
import me.night.nullvalkyrie.packets.protocol.PacketPlayOutSpawnEntity;
|
|
||||||
import me.night.nullvalkyrie.util.*;
|
import me.night.nullvalkyrie.util.*;
|
||||||
import net.minecraft.network.protocol.game.*;
|
import net.minecraft.network.protocol.game.*;
|
||||||
import net.minecraft.network.syncher.*;
|
import net.minecraft.network.syncher.*;
|
||||||
|
@ -17,10 +17,10 @@ import net.minecraft.world.entity.EquipmentSlot;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.CraftServer;
|
import org.bukkit.craftbukkit.v1_19_R1.CraftServer;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.CraftWorld;
|
import org.bukkit.craftbukkit.v1_19_R1.CraftWorld;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
|
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack;
|
import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
@ -30,34 +30,37 @@ import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public class NPCManager {
|
public class NPCManager {
|
||||||
private static final List<ServerPlayer> NPCs = new ArrayList<>();
|
private static final HashMap<Integer, ServerPlayer> NPCs = new HashMap<>();
|
||||||
|
|
||||||
public static List<ServerPlayer> getNPCs() {
|
public static HashMap<Integer, ServerPlayer> getNPCs() {
|
||||||
return NPCs;
|
return NPCs;
|
||||||
}
|
}
|
||||||
|
@SuppressWarnings("ConstantConditions")
|
||||||
public static void createNPC(Player player, String name) { // name must be less than 16 characters including color codes
|
public static void createNPC(Player player, String name) { // name must be less than 16 characters including color codes
|
||||||
// TODO: npc not even spawning rn
|
|
||||||
ServerPlayer sp = ((CraftPlayer) player).getHandle();
|
ServerPlayer sp = ((CraftPlayer) player).getHandle();
|
||||||
MinecraftServer server = sp.server;
|
MinecraftServer server = sp.server;
|
||||||
ServerLevel level = ((CraftWorld) player.getLocation().getWorld()).getHandle();
|
ServerLevel level = ((CraftWorld) player.getLocation().getWorld()).getHandle();
|
||||||
GameProfile gameProfile = new GameProfile(UUID.randomUUID(), Util.color(name));
|
GameProfile gameProfile = new GameProfile(UUID.randomUUID(), Util.color(name));
|
||||||
String[] skin = Skin.getSkin(player);
|
String[] skin = Skin.getSkin(player);
|
||||||
gameProfile.getProperties().put("textures", new Property("textures", skin[0], skin[1]));
|
gameProfile.getProperties().put("textures", new Property("textures", skin[0], skin[1]));
|
||||||
ServerPlayer npc = new ServerPlayer(server, level, gameProfile);
|
ServerPlayer npc = new ServerPlayer(server, level, gameProfile, null);
|
||||||
Location location = player.getLocation();
|
Location location = player.getLocation();
|
||||||
npc.setPos(location.getX(), location.getY(), location.getZ());
|
npc.setPos(location.getX(), location.getY(), location.getZ());
|
||||||
addNPCPacket(npc);
|
addNPCPacket(npc);
|
||||||
NPCs.add(npc);
|
NPCs.put(npc.getId(), npc);
|
||||||
NPCDataManager.setNPC(name, (int) player.getLocation().getX(), (int) player.getLocation().getY(), (int) player.getLocation().getZ(), (int) player.getLocation().getPitch(), (int) player.getLocation().getYaw(), player.getLocation().getWorld().getName(), skin[0], skin[1]);
|
NPCDataManager.setNPC(name, player.getLocation().getX(), player.getLocation().getY(), player.getLocation().getZ(), (int) player.getLocation().getPitch(), (int) player.getLocation().getYaw(), player.getLocation().getWorld().getName(), skin[0], skin[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void addNPCPacket(ServerPlayer npc) {
|
public static void addNPCPacket(ServerPlayer npc) {
|
||||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||||
ServerGamePacketListenerImpl pc = ((CraftPlayer) player).getHandle().connection;
|
ServerGamePacketListenerImpl pc = ((CraftPlayer) player).getHandle().connection;
|
||||||
new PacketPlayOutSpawnEntity(player, npc);
|
pc.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, npc));
|
||||||
|
pc.send(new ClientboundAddPlayerPacket(npc));
|
||||||
pc.send(new ClientboundRotateHeadPacket(npc, (byte) (npc.getBukkitYaw() * 256 / 360)));
|
pc.send(new ClientboundRotateHeadPacket(npc, (byte) (npc.getBukkitYaw() * 256 / 360)));
|
||||||
SynchedEntityData watcher = npc.getEntityData();
|
SynchedEntityData watcher = npc.getEntityData();
|
||||||
watcher.set(new EntityDataAccessor<>(17, EntityDataSerializers.BYTE), (byte) 127);
|
watcher.set(new EntityDataAccessor<>(17, EntityDataSerializers.BYTE), (byte) 127);
|
||||||
new PacketPlayOutEntityMetadata(player, npc, watcher.getNonDefaultValues());
|
new PacketPlayOutEntityMetadata(player, npc, watcher);
|
||||||
|
Bukkit.getScheduler().runTaskLaterAsynchronously(NullValkyrie.getPlugin(NullValkyrie.class), () -> pc.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.REMOVE_PLAYER, npc)), 50);
|
||||||
ItemStack netheriteAxe = new ItemStack(Material.NETHERITE_AXE);
|
ItemStack netheriteAxe = new ItemStack(Material.NETHERITE_AXE);
|
||||||
ItemStack anotherAxe = new ItemStack(Material.NETHERITE_INGOT);
|
ItemStack anotherAxe = new ItemStack(Material.NETHERITE_INGOT);
|
||||||
List<Pair<EquipmentSlot, net.minecraft.world.item.ItemStack>> itemList = new ArrayList<>();
|
List<Pair<EquipmentSlot, net.minecraft.world.item.ItemStack>> itemList = new ArrayList<>();
|
||||||
|
@ -68,13 +71,15 @@ public class NPCManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void addJoinPacket(Player player) {
|
public static void addJoinPacket(Player player) {
|
||||||
for (ServerPlayer npc : NPCs) {
|
for (ServerPlayer npc : NPCs.values()) {
|
||||||
ServerGamePacketListenerImpl pc = ((CraftPlayer) player).getHandle().connection;
|
ServerGamePacketListenerImpl pc = ((CraftPlayer) player).getHandle().connection;
|
||||||
new PacketPlayOutSpawnEntity(player, npc);
|
pc.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, npc));
|
||||||
|
pc.send(new ClientboundAddPlayerPacket(npc));
|
||||||
pc.send(new ClientboundRotateHeadPacket(npc, (byte) (npc.getBukkitYaw() * 256 / 360)));
|
pc.send(new ClientboundRotateHeadPacket(npc, (byte) (npc.getBukkitYaw() * 256 / 360)));
|
||||||
SynchedEntityData watcher = npc.getEntityData();
|
SynchedEntityData watcher = npc.getEntityData();
|
||||||
watcher.set(new EntityDataAccessor<>(17, EntityDataSerializers.BYTE), (byte) 127);
|
watcher.set(new EntityDataAccessor<>(17, EntityDataSerializers.BYTE), (byte) 127);
|
||||||
new PacketPlayOutEntityMetadata(player, npc, watcher.getNonDefaultValues());
|
new PacketPlayOutEntityMetadata(player, npc, watcher);
|
||||||
|
Bukkit.getScheduler().runTaskLaterAsynchronously(NullValkyrie.getPlugin(NullValkyrie.class), () -> pc.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.REMOVE_PLAYER, npc)), 50);
|
||||||
ItemStack netheriteAxe = new ItemStack(Material.NETHERITE_AXE);
|
ItemStack netheriteAxe = new ItemStack(Material.NETHERITE_AXE);
|
||||||
ItemStack anotherAxe = new ItemStack(Material.NETHERITE_INGOT);
|
ItemStack anotherAxe = new ItemStack(Material.NETHERITE_INGOT);
|
||||||
List<Pair<EquipmentSlot, net.minecraft.world.item.ItemStack>> itemList = new ArrayList<>();
|
List<Pair<EquipmentSlot, net.minecraft.world.item.ItemStack>> itemList = new ArrayList<>();
|
||||||
|
@ -83,18 +88,21 @@ public class NPCManager {
|
||||||
pc.send(new ClientboundSetEquipmentPacket(npc.getBukkitEntity().getEntityId(), itemList));
|
pc.send(new ClientboundSetEquipmentPacket(npc.getBukkitEntity().getEntityId(), itemList));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@SuppressWarnings("ConstantConditions")
|
||||||
public static void reloadNPC(List<HashMap<String, Object>> npcs) {
|
public static void reloadNPC(List<HashMap<String, Object>> npcs) {
|
||||||
for (HashMap<String, Object> npc : npcs) {
|
for (HashMap<String, Object> npc : npcs) {
|
||||||
Location location = new Location(Bukkit.getWorld((String) npc.get("world")), (int) npc.get("x"), (int) npc.get("y"), (int) npc.get("z"), (int) npc.get("yaw"), (int) npc.get("pitch"));
|
Location location = new Location(Bukkit.getWorld((String) npc.get("world")), (double) npc.get("x"), (double) npc.get("y"), (double) npc.get("z"), (int) npc.get("yaw"), (int) npc.get("pitch"));
|
||||||
GameProfile gameProfile = new GameProfile(UUID.randomUUID(), Util.color((String) npc.get("name")));
|
GameProfile gameProfile = new GameProfile(UUID.randomUUID(), Util.color((String) npc.get("name")));
|
||||||
gameProfile.getProperties().put("textures", new Property("textures", (String) npc.get("texture"), (String) npc.get("signature")));
|
gameProfile.getProperties().put("textures", new Property("textures", (String) npc.get("texture"), (String) npc.get("signature")));
|
||||||
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
|
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
|
||||||
ServerLevel w = ((CraftWorld) location.getWorld()).getHandle();
|
ServerLevel w = ((CraftWorld) location.getWorld()).getHandle();
|
||||||
ServerPlayer ep = new ServerPlayer(server, w, gameProfile);
|
ServerPlayer ep = new ServerPlayer(server, w, gameProfile, null);
|
||||||
ep.setPos(location.getX(), location.getY(), location.getZ()); // NMS: 1.19.2 https://nms.screamingsandals.org/1.19.2/net/minecraft/world/entity/Entity.html absMoveTo
|
ep.setPos(location.getX(), location.getY(), location.getZ()); // NMS: 1.19.2 https://nms.screamingsandals.org/1.19.2/net/minecraft/world/entity/Entity.html absMoveTo
|
||||||
addNPCPacket(ep);
|
addNPCPacket(ep);
|
||||||
NPCs.add(ep);
|
NPCs.put(ep.getId(), ep);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public static ServerPlayer getNPC(int id) {
|
||||||
|
return NPCs.get(id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,8 +7,8 @@ import net.minecraft.world.entity.ai.goal.FloatGoal;
|
||||||
import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal;
|
import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal;
|
||||||
import net.minecraft.world.entity.monster.Zombie;
|
import net.minecraft.world.entity.monster.Zombie;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.CraftWorld;
|
import org.bukkit.craftbukkit.v1_19_R1.CraftWorld;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
|
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.entity.EntityTargetEvent;
|
import org.bukkit.event.entity.EntityTargetEvent;
|
||||||
|
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
package me.night.nullvalkyrie.enums;
|
|
||||||
|
|
||||||
import org.bukkit.Material;
|
|
||||||
|
|
||||||
public enum MinerType {
|
|
||||||
DIAMOND("Diamond", Material.DIAMOND_ORE, "https://textures.minecraft.net/texture/c09cc3c75bd13c59602040b5970f30dbc76825c0e817da815a65d76ab0e82198"), EMERALD("Emerald", Material.EMERALD_ORE, "https://textures.minecraft.net/texture/c09cc3c75bd13c59602040b5970f30dbc76825c0e817da815a65d76ab0e82198"), GOLD("Gold", Material.GOLD_ORE, "https://textures.minecraft.net/texture/c09cc3c75bd13c59602040b5970f30dbc76825c0e817da815a65d76ab0e82198"), IRON("Iron", Material.IRON_ORE, "https://textures.minecraft.net/texture/c09cc3c75bd13c59602040b5970f30dbc76825c0e817da815a65d76ab0e82198"), REDSTONE("Redstone", Material.REDSTONE_ORE, "https://textures.minecraft.net/texture/c09cc3c75bd13c59602040b5970f30dbc76825c0e817da815a65d76ab0e82198"), COAL("Coal", Material.COAL_ORE, "https://textures.minecraft.net/texture/c09cc3c75bd13c59602040b5970f30dbc76825c0e817da815a65d76ab0e82198"), LAPIS("Lapis", Material.LAPIS_ORE, "https://textures.minecraft.net/texture/c09cc3c75bd13c59602040b5970f30dbc76825c0e817da815a65d76ab0e82198"), QUARTZ("Quartz", Material.NETHER_QUARTZ_ORE, "https://textures.minecraft.net/texture/c09cc3c75bd13c59602040b5970f30dbc76825c0e817da815a65d76ab0e82198"), OBSIDIAN("Obsidian", Material.OBSIDIAN, "https://textures.minecraft.net/texture/c09cc3c75bd13c59602040b5970f30dbc76825c0e817da815a65d76ab0e82198"), NETHERITE("Netherite", Material.ANCIENT_DEBRIS, "https://textures.minecraft.net/texture/c09cc3c75bd13c59602040b5970f30dbc76825c0e817da815a65d76ab0e82198");
|
|
||||||
private final String name;
|
|
||||||
private final Material material;
|
|
||||||
private final String headTexture;
|
|
||||||
|
|
||||||
MinerType(String name, Material material, String headTexture) {
|
|
||||||
this.name = name;
|
|
||||||
this.material = material;
|
|
||||||
this.headTexture = headTexture;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Material getMaterial() {
|
|
||||||
return material;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getHeadTexture() {
|
|
||||||
return headTexture;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static MinerType getByName(String name) {
|
|
||||||
for (MinerType type : MinerType.values()) {
|
|
||||||
if (type.getName().equalsIgnoreCase(name)) {
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,30 +1,39 @@
|
||||||
package me.night.nullvalkyrie.events.listeners;
|
package me.night.nullvalkyrie.events.listeners;
|
||||||
|
|
||||||
|
import me.night.nullvalkyrie.entities.holograms.PerPlayerHologram;
|
||||||
|
import me.night.nullvalkyrie.events.custom.InteractHologramEvent;
|
||||||
import me.night.nullvalkyrie.events.custom.RightClickNPCEvent;
|
import me.night.nullvalkyrie.events.custom.RightClickNPCEvent;
|
||||||
import me.night.nullvalkyrie.entities.npcs.NPCManager;
|
import me.night.nullvalkyrie.entities.npcs.NPCManager;
|
||||||
import me.night.nullvalkyrie.util.Util;
|
import me.night.nullvalkyrie.util.Util;
|
||||||
import net.minecraft.network.protocol.game.ClientboundMoveEntityPacket;
|
import net.minecraft.network.protocol.game.ClientboundMoveEntityPacket;
|
||||||
import net.minecraft.network.protocol.game.ClientboundRotateHeadPacket;
|
import net.minecraft.network.protocol.game.ClientboundRotateHeadPacket;
|
||||||
import net.minecraft.server.network.ServerGamePacketListenerImpl;
|
import net.minecraft.server.network.ServerGamePacketListenerImpl;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
|
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.player.PlayerMoveEvent;
|
import org.bukkit.event.player.PlayerMoveEvent;
|
||||||
|
|
||||||
public class NPCEvents implements Listener {
|
public class CustomEvents implements Listener {
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onClick(RightClickNPCEvent e) {
|
public void onClick(RightClickNPCEvent e) {
|
||||||
Player player = e.getPlayer();
|
Player player = e.getPlayer();
|
||||||
if (e.getNPC().getBukkitEntity().getName().contains("SAI")) {
|
if (e.getNPC().getBukkitEntity().getName().contains("VETTEL")) {
|
||||||
player.sendMessage(Util.color("Hi"));
|
player.sendMessage(Util.color("Hi"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@EventHandler
|
||||||
|
public void onClickHologram(InteractHologramEvent e) {
|
||||||
|
if (e.getHologram().getCustomName() == null) return;
|
||||||
|
if (e.getHologram().getCustomName().equals(ChatColor.GOLD + ChatColor.BOLD.toString() + "CLICK")) {
|
||||||
|
e.getHologram().getNearbyEntities(0, 5, 0).forEach(entity -> new PerPlayerHologram(e.getPlayer(), new String[]{ChatColor.RED + "Player Info:", ChatColor.GOLD + "Name: " + ChatColor.AQUA + e.getPlayer().getName(), ChatColor.BLUE + "IP: " + e.getPlayer().getAddress()}));
|
||||||
|
}
|
||||||
|
}
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onMove(PlayerMoveEvent e) {
|
public void onMove(PlayerMoveEvent e) {
|
||||||
NPCManager.getNPCs().forEach(npc -> {
|
NPCManager.getNPCs().values().forEach(npc -> {
|
||||||
Location location = npc.getBukkitEntity().getLocation();
|
Location location = npc.getBukkitEntity().getLocation();
|
||||||
location.setDirection(e.getPlayer().getLocation().subtract(location).toVector());
|
location.setDirection(e.getPlayer().getLocation().subtract(location).toVector());
|
||||||
float yaw = location.getYaw();
|
float yaw = location.getYaw();
|
|
@ -2,8 +2,8 @@ package me.night.nullvalkyrie.events.listeners;
|
||||||
|
|
||||||
import me.night.nullvalkyrie.entities.items.CustomItemManager;
|
import me.night.nullvalkyrie.entities.items.CustomItemManager;
|
||||||
import me.night.nullvalkyrie.entities.items.Pickaxe;
|
import me.night.nullvalkyrie.entities.items.Pickaxe;
|
||||||
import me.night.nullvalkyrie.enums.Rarity;
|
import me.night.nullvalkyrie.entities.miners.Rarity;
|
||||||
import me.night.nullvalkyrie.Main;
|
import me.night.nullvalkyrie.NullValkyrie;
|
||||||
import me.night.nullvalkyrie.packets.protocol.PacketPlayOutBlockBreakAnimation;
|
import me.night.nullvalkyrie.packets.protocol.PacketPlayOutBlockBreakAnimation;
|
||||||
import net.md_5.bungee.api.ChatMessageType;
|
import net.md_5.bungee.api.ChatMessageType;
|
||||||
import net.md_5.bungee.api.chat.TextComponent;
|
import net.md_5.bungee.api.chat.TextComponent;
|
||||||
|
@ -245,7 +245,7 @@ public class CustomItemEvents implements Listener {
|
||||||
// player.setHealth(20);
|
// player.setHealth(20);
|
||||||
// player.teleport(generateRandomCoord(9, Bukkit.getWorld("world")));
|
// player.teleport(generateRandomCoord(9, Bukkit.getWorld("world")));
|
||||||
// }
|
// }
|
||||||
// }.runTaskLater(Main.getPlugin(Main.class), 100L);
|
// }.runTaskLater(NullValkyrie.getPlugin(NullValkyrie.class), 100L);
|
||||||
// countDown(player, new int[]{5});
|
// countDown(player, new int[]{5});
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
@ -255,7 +255,7 @@ public class CustomItemEvents implements Listener {
|
||||||
private int taskID;
|
private int taskID;
|
||||||
|
|
||||||
public void countDown(Player player, int[] a) {
|
public void countDown(Player player, int[] a) {
|
||||||
taskID = Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(Main.getPlugin(Main.class), () -> {
|
taskID = Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(NullValkyrie.getPlugin(NullValkyrie.class), () -> {
|
||||||
player.sendTitle(ChatColor.RED + "YOU DIED!", ChatColor.GREEN + "You will revive in " + a[0] + " seconds", 0, 20, 0);
|
player.sendTitle(ChatColor.RED + "YOU DIED!", ChatColor.GREEN + "You will revive in " + a[0] + " seconds", 0, 20, 0);
|
||||||
a[0]--;
|
a[0]--;
|
||||||
if (a[0] == 0) {
|
if (a[0] == 0) {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package me.night.nullvalkyrie.events.listeners;
|
package me.night.nullvalkyrie.events.listeners;
|
||||||
|
|
||||||
import me.night.nullvalkyrie.Main;
|
import me.night.nullvalkyrie.NullValkyrie;
|
||||||
import me.night.nullvalkyrie.util.Util;
|
import me.night.nullvalkyrie.util.Util;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
|
@ -60,7 +60,7 @@ public class DamageEffectEvents implements Listener {
|
||||||
}
|
}
|
||||||
removal.forEach(stands::remove);
|
removal.forEach(stands::remove);
|
||||||
}
|
}
|
||||||
}.runTaskTimer(Main.getPlugin(Main.class), 0L, 1L);
|
}.runTaskTimer(NullValkyrie.getPlugin(NullValkyrie.class), 0L, 1L);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isSpawnable(Location loc) {
|
public boolean isSpawnable(Location loc) {
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package me.night.nullvalkyrie.events.listeners;
|
package me.night.nullvalkyrie.events.listeners;
|
||||||
|
|
||||||
import me.night.nullvalkyrie.events.custom.InteractHologramEvent;
|
|
||||||
import me.night.nullvalkyrie.packets.handle.PacketInjector;
|
import me.night.nullvalkyrie.packets.handle.PacketInjector;
|
||||||
import me.night.nullvalkyrie.util.Util;
|
import me.night.nullvalkyrie.util.Util;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
@ -29,7 +28,6 @@ public class ServerEvents implements Listener {
|
||||||
public void onJoin(PlayerJoinEvent e) {
|
public void onJoin(PlayerJoinEvent e) {
|
||||||
bossbar.addPlayer(e.getPlayer());
|
bossbar.addPlayer(e.getPlayer());
|
||||||
injector.addPlayer(e.getPlayer());
|
injector.addPlayer(e.getPlayer());
|
||||||
e.getPlayer().setResourcePack("https://www.dropbox.com/s/7y7p93xzhar6vvw/%C2%A7b%C2%A7lNKRP%201.19.3.zip?dl=1");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
|
@ -50,14 +48,6 @@ public class ServerEvents implements Listener {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void onClickHologram(InteractHologramEvent e) {
|
|
||||||
if (e.getHologram().getCustomName() == null) return;
|
|
||||||
if (e.getHologram().getCustomName().equals(ChatColor.GOLD + "Click me to change!!!")) {
|
|
||||||
// TODO: change hologram things
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onWeatherChange(WeatherChangeEvent e) {
|
public void onWeatherChange(WeatherChangeEvent e) {
|
||||||
e.setCancelled(true);
|
e.setCancelled(true);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package me.night.nullvalkyrie.tasks;
|
package me.night.nullvalkyrie.game.tasks;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
|
@ -3,18 +3,29 @@ package me.night.nullvalkyrie.packets.handle;
|
||||||
import io.netty.channel.ChannelDuplexHandler;
|
import io.netty.channel.ChannelDuplexHandler;
|
||||||
import io.netty.channel.ChannelHandlerContext;
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
import io.netty.channel.ChannelPromise;
|
import io.netty.channel.ChannelPromise;
|
||||||
import me.night.nullvalkyrie.Main;
|
import me.night.nullvalkyrie.NullValkyrie;
|
||||||
|
import me.night.nullvalkyrie.entities.holograms.PerPlayerHologram;
|
||||||
import me.night.nullvalkyrie.entities.npcs.NPCManager;
|
import me.night.nullvalkyrie.entities.npcs.NPCManager;
|
||||||
import me.night.nullvalkyrie.events.custom.InteractHologramEvent;
|
import me.night.nullvalkyrie.events.custom.InteractHologramEvent;
|
||||||
import me.night.nullvalkyrie.events.custom.RightClickNPCEvent;
|
import me.night.nullvalkyrie.events.custom.RightClickNPCEvent;
|
||||||
import me.night.nullvalkyrie.util.Util;
|
import me.night.nullvalkyrie.util.Util;
|
||||||
|
import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket;
|
||||||
|
import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket;
|
||||||
import net.minecraft.network.protocol.game.ServerboundInteractPacket;
|
import net.minecraft.network.protocol.game.ServerboundInteractPacket;
|
||||||
|
import net.minecraft.network.syncher.EntityDataAccessor;
|
||||||
|
import net.minecraft.network.syncher.EntityDataSerializers;
|
||||||
|
import net.minecraft.network.syncher.SynchedEntityData;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
|
||||||
import org.bukkit.entity.ArmorStand;
|
import org.bukkit.entity.ArmorStand;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.entity.EntityType;
|
import org.bukkit.entity.EntityType;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
public class PacketHandler extends ChannelDuplexHandler {
|
public class PacketHandler extends ChannelDuplexHandler {
|
||||||
private final Player player;
|
private final Player player;
|
||||||
|
@ -25,6 +36,28 @@ public class PacketHandler extends ChannelDuplexHandler {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void write(ChannelHandlerContext ctx, Object packet, ChannelPromise promise) throws Exception {
|
public void write(ChannelHandlerContext ctx, Object packet, ChannelPromise promise) throws Exception {
|
||||||
|
if (packet.getClass().getSimpleName().equalsIgnoreCase("PacketPlayOutEntityMetadat")) {
|
||||||
|
ClientboundSetEntityDataPacket pk = (ClientboundSetEntityDataPacket) packet;
|
||||||
|
int entityID = pk.getId();
|
||||||
|
final Entity[] entity = {null};
|
||||||
|
// get entity from id
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
for (Entity e : Bukkit.getWorld("world").getEntities()) {
|
||||||
|
if (e.getEntityId() == entityID && e.getType() == EntityType.PLAYER) {
|
||||||
|
entity[0] = e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.runTaskLater(NullValkyrie.getPlugin(NullValkyrie.class), 0);
|
||||||
|
if (entity[0] == null) return;
|
||||||
|
List<SynchedEntityData.DataItem<?>> list = pk.getUnpackedData();
|
||||||
|
SynchedEntityData.DataItem<Float> value = (SynchedEntityData.DataItem<Float>) list.get(9);
|
||||||
|
System.out.println(value.getAccessor());
|
||||||
|
float health = ThreadLocalRandom.current().nextInt(5, 20);
|
||||||
|
list.set(9, new SynchedEntityData.DataItem<>(new EntityDataAccessor<>(value.getAccessor().getId(), EntityDataSerializers.FLOAT), health));
|
||||||
|
}
|
||||||
super.write(ctx, packet, promise);
|
super.write(ctx, packet, promise);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,26 +67,24 @@ public class PacketHandler extends ChannelDuplexHandler {
|
||||||
ServerboundInteractPacket pk = (ServerboundInteractPacket) packet;
|
ServerboundInteractPacket pk = (ServerboundInteractPacket) packet;
|
||||||
int entityID = (int) Util.getFieldValue(packet, "a");
|
int entityID = (int) Util.getFieldValue(packet, "a");
|
||||||
boolean sneak = (boolean) Util.getFieldValue(packet, "c");
|
boolean sneak = (boolean) Util.getFieldValue(packet, "c");
|
||||||
Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getPlugin(Main.class), () -> {
|
Bukkit.getScheduler().scheduleSyncDelayedTask(NullValkyrie.getPlugin(NullValkyrie.class), () -> {
|
||||||
for (Entity entity : Bukkit.getWorld("world").getEntities()) {
|
net.minecraft.world.entity.decoration.ArmorStand[] stands = PerPlayerHologram.getHolograms().get(entityID);
|
||||||
if (entity.getEntityId() == entityID && entity.getType() == EntityType.ARMOR_STAND) {
|
if (stands == null) return;
|
||||||
Bukkit.getPluginManager().callEvent(new InteractHologramEvent(player, (ArmorStand) entity));
|
Bukkit.getPluginManager().callEvent(new InteractHologramEvent(player, (ArmorStand) stands[stands.length - 1].getBukkitEntity()));
|
||||||
}
|
for (net.minecraft.world.entity.decoration.ArmorStand i : stands) {
|
||||||
|
((CraftPlayer) player).getHandle().connection.send(new ClientboundRemoveEntitiesPacket(i.getId()));
|
||||||
}
|
}
|
||||||
}, 0);
|
}, 0);
|
||||||
Object data = Util.getFieldValue(pk, "b");
|
Object data = Util.getFieldValue(pk, "b");
|
||||||
if (data.toString().split("\\$")[1].charAt(0) == 'e')
|
if (data.toString().split("\\$")[1].charAt(0) == 'e') return;
|
||||||
return;
|
|
||||||
try {
|
try {
|
||||||
Object hand = Util.getFieldValue(data, "a");
|
Object hand = Util.getFieldValue(data, "a");
|
||||||
if (!hand.toString().equals("MAIN_HAND")) return;
|
if (!hand.toString().equals("MAIN_HAND")) return;
|
||||||
|
ServerPlayer npc = NPCManager.getNPC(entityID);
|
||||||
|
if (npc == null) return;
|
||||||
//Right Click
|
//Right Click
|
||||||
for (ServerPlayer npcs : NPCManager.getNPCs()) {
|
if (npc.getBukkitEntity().getEntityId() == entityID && sneak)
|
||||||
if (npcs.getBukkitEntity().getEntityId() == entityID && sneak) {
|
Bukkit.getScheduler().scheduleSyncDelayedTask(NullValkyrie.getPlugin(NullValkyrie.class), () -> Bukkit.getPluginManager().callEvent(new RightClickNPCEvent(player, npc)), 0);
|
||||||
Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getPlugin(Main.class), () -> Bukkit.getPluginManager().callEvent(new RightClickNPCEvent(player, npcs)), 0);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (NoSuchFieldException x) {
|
} catch (NoSuchFieldException x) {
|
||||||
//Left Click
|
//Left Click
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package me.night.nullvalkyrie.packets.protocol;
|
package me.night.nullvalkyrie.packets.protocol;
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
|
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
public class Channel {
|
public class Channel {
|
||||||
|
|
|
@ -3,7 +3,7 @@ package me.night.nullvalkyrie.packets.protocol;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.network.protocol.game.ClientboundBlockDestructionPacket;
|
import net.minecraft.network.protocol.game.ClientboundBlockDestructionPacket;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
|
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
public class PacketPlayOutBlockBreakAnimation implements Packet {
|
public class PacketPlayOutBlockBreakAnimation implements Packet {
|
||||||
|
|
|
@ -3,13 +3,11 @@ package me.night.nullvalkyrie.packets.protocol;
|
||||||
import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket;
|
import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket;
|
||||||
import net.minecraft.network.syncher.SynchedEntityData;
|
import net.minecraft.network.syncher.SynchedEntityData;
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
|
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class PacketPlayOutEntityMetadata implements Packet {
|
public class PacketPlayOutEntityMetadata implements Packet {
|
||||||
public PacketPlayOutEntityMetadata(Player player, Entity entity, List<SynchedEntityData.DataValue<?>> list) {
|
public PacketPlayOutEntityMetadata(Player player, Entity entity, SynchedEntityData entityData) {
|
||||||
((CraftPlayer) player).getHandle().connection.send(new ClientboundSetEntityDataPacket(entity.getBukkitEntity().getEntityId(), list));
|
((CraftPlayer) player).getHandle().connection.send(new ClientboundSetEntityDataPacket(entity.getBukkitEntity().getEntityId(), entityData, true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@ package me.night.nullvalkyrie.packets.protocol;
|
||||||
|
|
||||||
import net.minecraft.network.protocol.game.ClientboundAddEntityPacket;
|
import net.minecraft.network.protocol.game.ClientboundAddEntityPacket;
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
|
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
public class PacketPlayOutSpawnEntity implements Packet {
|
public class PacketPlayOutSpawnEntity implements Packet {
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
package me.night.nullvalkyrie.ui.inventory;
|
package me.night.nullvalkyrie.ui.inventory;
|
||||||
|
|
||||||
import me.night.nullvalkyrie.Main;
|
import me.night.nullvalkyrie.NullValkyrie;
|
||||||
import me.night.nullvalkyrie.database.UserDataManager;
|
import me.night.nullvalkyrie.database.UserDataManager;
|
||||||
import me.night.nullvalkyrie.enums.Items;
|
import me.night.nullvalkyrie.entities.items.Items;
|
||||||
import me.night.nullvalkyrie.util.RandomCollection;
|
import me.night.nullvalkyrie.util.RandomCollection;
|
||||||
import me.night.nullvalkyrie.util.Util;
|
import me.night.nullvalkyrie.util.Util;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
|
@ -142,7 +142,7 @@ public class InventoryListener implements Listener {
|
||||||
ii++;
|
ii++;
|
||||||
time++;
|
time++;
|
||||||
}
|
}
|
||||||
}.runTaskTimer(Main.getPlugin(Main.class), 1L, 5L);
|
}.runTaskTimer(NullValkyrie.getPlugin(NullValkyrie.class), 1L, 5L);
|
||||||
new BukkitRunnable() {
|
new BukkitRunnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
@ -184,7 +184,7 @@ public class InventoryListener implements Listener {
|
||||||
player.getInventory().addItem(item);
|
player.getInventory().addItem(item);
|
||||||
} else player.closeInventory();
|
} else player.closeInventory();
|
||||||
}
|
}
|
||||||
}.runTaskLater(Main.getPlugin(Main.class), 5L * 20L);
|
}.runTaskLater(NullValkyrie.getPlugin(NullValkyrie.class), 5L * 20L);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package me.night.nullvalkyrie.ui.inventory;
|
package me.night.nullvalkyrie.ui.inventory;
|
||||||
|
|
||||||
import me.night.nullvalkyrie.enums.Items;
|
import me.night.nullvalkyrie.entities.items.Items;
|
||||||
import me.night.nullvalkyrie.util.Util;
|
import me.night.nullvalkyrie.util.Util;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
|
|
|
@ -7,7 +7,7 @@ import org.bukkit.scoreboard.*;
|
||||||
public class BelowNameManager {
|
public class BelowNameManager {
|
||||||
public void setBelowName(Player player) {
|
public void setBelowName(Player player) {
|
||||||
Scoreboard board = player.getScoreboard();
|
Scoreboard board = player.getScoreboard();
|
||||||
Objective obj = board.registerNewObjective("HealthBar", Criteria.create("CustomHealth"), ChatColor.RED.toString() + player.getHealth() + "❤");
|
Objective obj = board.registerNewObjective("HealthBar", Criteria.HEALTH, ChatColor.RED + "❤");
|
||||||
obj.setDisplaySlot(DisplaySlot.BELOW_NAME);
|
obj.setDisplaySlot(DisplaySlot.BELOW_NAME);
|
||||||
player.setScoreboard(board);
|
player.setScoreboard(board);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package me.night.nullvalkyrie.ui.player;
|
package me.night.nullvalkyrie.ui.player;
|
||||||
|
|
||||||
import me.night.nullvalkyrie.database.RankDataManager;
|
import me.night.nullvalkyrie.database.RankDataManager;
|
||||||
import me.night.nullvalkyrie.enums.Rank;
|
import me.night.nullvalkyrie.util.Rank;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.scoreboard.*;
|
import org.bukkit.scoreboard.*;
|
||||||
|
|
|
@ -2,7 +2,8 @@ package me.night.nullvalkyrie.ui.player;
|
||||||
|
|
||||||
import me.night.nullvalkyrie.database.RankDataManager;
|
import me.night.nullvalkyrie.database.RankDataManager;
|
||||||
import me.night.nullvalkyrie.database.UserDataManager;
|
import me.night.nullvalkyrie.database.UserDataManager;
|
||||||
import me.night.nullvalkyrie.enums.Rank;
|
import me.night.nullvalkyrie.entities.miners.CryptoMiner;
|
||||||
|
import me.night.nullvalkyrie.util.Rank;
|
||||||
import me.night.nullvalkyrie.entities.npcs.NPCManager;
|
import me.night.nullvalkyrie.entities.npcs.NPCManager;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
|
@ -30,6 +31,7 @@ public class ScoreboardListener implements Listener {
|
||||||
public void onJoin(PlayerJoinEvent e) {
|
public void onJoin(PlayerJoinEvent e) {
|
||||||
Player player = e.getPlayer();
|
Player player = e.getPlayer();
|
||||||
if (!player.hasPlayedBefore()) {
|
if (!player.hasPlayedBefore()) {
|
||||||
|
e.getPlayer().setResourcePack("https://www.dropbox.com/s/7y7p93xzhar6vvw/%C2%A7b%C2%A7lNKRP%201.19.3.zip?dl=1");
|
||||||
e.getPlayer().sendTitle(ChatColor.RED + "Welcome to Vanadium!", ChatColor.GREEN + "LOL", 20, 100, 20);
|
e.getPlayer().sendTitle(ChatColor.RED + "Welcome to Vanadium!", ChatColor.GREEN + "LOL", 20, 100, 20);
|
||||||
RankDataManager.setRank(player.getUniqueId(), Rank.ROOKIE, this);
|
RankDataManager.setRank(player.getUniqueId(), Rank.ROOKIE, this);
|
||||||
new UserDataManager().createUserBank(e.getPlayer().getUniqueId().toString());
|
new UserDataManager().createUserBank(e.getPlayer().getUniqueId().toString());
|
||||||
|
@ -44,6 +46,7 @@ public class ScoreboardListener implements Listener {
|
||||||
if (NPCManager.getNPCs() == null) return;
|
if (NPCManager.getNPCs() == null) return;
|
||||||
if (NPCManager.getNPCs().isEmpty()) return;
|
if (NPCManager.getNPCs().isEmpty()) return;
|
||||||
NPCManager.addJoinPacket(e.getPlayer());
|
NPCManager.addJoinPacket(e.getPlayer());
|
||||||
|
CryptoMiner.onJoin(e.getPlayer());
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package me.night.nullvalkyrie.ui.player;
|
package me.night.nullvalkyrie.ui.player;
|
||||||
|
|
||||||
import me.night.nullvalkyrie.Main;
|
import me.night.nullvalkyrie.NullValkyrie;
|
||||||
import me.night.nullvalkyrie.database.UserDataManager;
|
import me.night.nullvalkyrie.database.UserDataManager;
|
||||||
import me.night.nullvalkyrie.util.Util;
|
import me.night.nullvalkyrie.util.Util;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
@ -50,7 +50,7 @@ public class SideBarManager {
|
||||||
|
|
||||||
public void start(Player player) {
|
public void start(Player player) {
|
||||||
board = new AnimatedSideBar(player.getUniqueId());
|
board = new AnimatedSideBar(player.getUniqueId());
|
||||||
taskID = Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.getPlugin(Main.class), new Runnable() {
|
taskID = Bukkit.getScheduler().scheduleSyncRepeatingTask(NullValkyrie.getPlugin(NullValkyrie.class), new Runnable() {
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
public void animate(String str) {
|
public void animate(String str) {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package me.night.nullvalkyrie.enums;
|
package me.night.nullvalkyrie.util;
|
||||||
|
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
|
|
|
@ -4,7 +4,7 @@ import com.google.gson.JsonObject;
|
||||||
import com.google.gson.JsonParser;
|
import com.google.gson.JsonParser;
|
||||||
import com.mojang.authlib.GameProfile;
|
import com.mojang.authlib.GameProfile;
|
||||||
import com.mojang.authlib.properties.Property;
|
import com.mojang.authlib.properties.Property;
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
|
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package me.night.nullvalkyrie.util.enchantments;
|
package me.night.nullvalkyrie.util.enchantments;
|
||||||
|
|
||||||
import me.night.nullvalkyrie.enums.Enchantments;
|
|
||||||
import org.bukkit.enchantments.Enchantment;
|
import org.bukkit.enchantments.Enchantment;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package me.night.nullvalkyrie.enums;
|
package me.night.nullvalkyrie.util.enchantments;
|
||||||
|
|
||||||
import me.night.nullvalkyrie.util.enchantments.EnchantmentManager;
|
|
||||||
import org.bukkit.enchantments.Enchantment;
|
import org.bukkit.enchantments.Enchantment;
|
||||||
|
|
||||||
public enum Enchantments {
|
public enum Enchantments {
|
Loading…
Reference in a new issue