added player knockback properties
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
64d6fc900b
commit
2813a92062
5 changed files with 87 additions and 4 deletions
|
@ -152,7 +152,7 @@ public class ZNpcsPlus {
|
|||
pluginManager.registerEvents(new UpdateNotificationListener(this, adventure, updateChecker, scheduler), bootstrap);
|
||||
}
|
||||
|
||||
scheduler.runDelayedTimerAsync(new NpcProcessorTask(npcRegistry, propertyRegistry), 60L, 3L);
|
||||
scheduler.runDelayedTimerAsync(new NpcProcessorTask(npcRegistry, propertyRegistry, userManager), 60L, 3L);
|
||||
scheduler.runDelayedTimerAsync(new HologramRefreshTask(npcRegistry), 60L, 20L);
|
||||
scheduler.runDelayedTimerAsync(new SkinCacheCleanTask(skinCache), 1200, 1200);
|
||||
pluginManager.registerEvents(new ViewableHideOnLeaveListener(), bootstrap);
|
||||
|
@ -275,6 +275,7 @@ public class ZNpcsPlus {
|
|||
registerEnumParser(manager, SnifferState.class, incorrectUsageMessage);
|
||||
registerEnumParser(manager, RabbitType.class, incorrectUsageMessage);
|
||||
registerEnumParser(manager, AttachDirection.class, incorrectUsageMessage);
|
||||
registerEnumParser(manager, Sound.class, incorrectUsageMessage);
|
||||
|
||||
manager.registerCommand("npc", new MultiCommand(bootstrap.loadHelpMessage("root"))
|
||||
.addSubcommand("center", new CenterCommand(npcRegistry))
|
||||
|
|
|
@ -24,6 +24,7 @@ import lol.pyr.znpcsplus.util.*;
|
|||
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
|
||||
import org.bukkit.Color;
|
||||
import org.bukkit.DyeColor;
|
||||
import org.bukkit.Sound;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
@ -84,6 +85,7 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
|
|||
registerEnumSerializer(SnifferState.class);
|
||||
registerEnumSerializer(RabbitType.class);
|
||||
registerEnumSerializer(AttachDirection.class);
|
||||
registerEnumSerializer(Sound.class);
|
||||
|
||||
registerPrimitiveSerializers(Integer.class, Boolean.class, Double.class, Float.class, Long.class, Short.class, Byte.class, String.class);
|
||||
|
||||
|
@ -122,6 +124,20 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
|
|||
|
||||
register(new DummyProperty<>("permission_required", false));
|
||||
|
||||
register(new DummyProperty<>("player_knockback", false));
|
||||
register(new DummyProperty<>("player_knockback_exempt_permission", String.class));
|
||||
register(new DummyProperty<>("player_knockback_distance", 0.4));
|
||||
register(new DummyProperty<>("player_knockback_vertical", 0.4));
|
||||
register(new DummyProperty<>("player_knockback_horizontal", 0.9));
|
||||
register(new DummyProperty<>("player_knockback_cooldown", 1500));
|
||||
register(new DummyProperty<>("player_knockback_sound", false));
|
||||
register(new DummyProperty<>("player_knockback_sound_volume", 1.0f));
|
||||
register(new DummyProperty<>("player_knockback_sound_pitch", 1.0f));
|
||||
register(new DummyProperty<>("player_knockback_sound_name", Sound.valueOf(
|
||||
PacketEvents.getAPI().getServerManager().getVersion().isOlderThan(ServerVersion.V_1_9) ?
|
||||
"VILLAGER_NO" : "ENTITY_VILLAGER_NO"
|
||||
)));
|
||||
|
||||
register(new GlowProperty(packetFactory));
|
||||
register(new BitsetProperty("fire", 0, 0x01));
|
||||
register(new BitsetProperty("invisible", 0, 0x20));
|
||||
|
|
|
@ -115,7 +115,10 @@ public class NpcTypeImpl implements NpcType {
|
|||
public NpcTypeImpl build() {
|
||||
ServerVersion version = PacketEvents.getAPI().getServerManager().getVersion();
|
||||
addProperties("fire", "invisible", "silent", "look", "look_distance", "view_distance",
|
||||
"potion_color", "potion_ambient", "display_name", "permission_required");
|
||||
"potion_color", "potion_ambient", "display_name", "permission_required",
|
||||
"player_knockback", "player_knockback_exempt_permission", "player_knockback_distance", "player_knockback_vertical",
|
||||
"player_knockback_horizontal", "player_knockback_cooldown", "player_knockback_sound", "player_knockback_sound_name",
|
||||
"player_knockback_sound_volume", "player_knockback_sound_pitch");
|
||||
if (!type.equals(EntityTypes.PLAYER)) addProperties("dinnerbone");
|
||||
// TODO: make this look nicer after completing the rest of the properties
|
||||
if (version.isNewerThanOrEquals(ServerVersion.V_1_9)) addProperties("glow");
|
||||
|
|
|
@ -7,20 +7,26 @@ import lol.pyr.znpcsplus.entity.EntityPropertyRegistryImpl;
|
|||
import lol.pyr.znpcsplus.npc.NpcEntryImpl;
|
||||
import lol.pyr.znpcsplus.npc.NpcImpl;
|
||||
import lol.pyr.znpcsplus.npc.NpcRegistryImpl;
|
||||
import lol.pyr.znpcsplus.user.User;
|
||||
import lol.pyr.znpcsplus.user.UserManager;
|
||||
import lol.pyr.znpcsplus.util.LookType;
|
||||
import lol.pyr.znpcsplus.util.NpcLocation;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.bukkit.util.NumberConversions;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
public class NpcProcessorTask extends BukkitRunnable {
|
||||
private final NpcRegistryImpl npcRegistry;
|
||||
private final EntityPropertyRegistryImpl propertyRegistry;
|
||||
private final UserManager userManager;
|
||||
|
||||
public NpcProcessorTask(NpcRegistryImpl npcRegistry, EntityPropertyRegistryImpl propertyRegistry) {
|
||||
public NpcProcessorTask(NpcRegistryImpl npcRegistry, EntityPropertyRegistryImpl propertyRegistry,UserManager userManager) {
|
||||
this.npcRegistry = npcRegistry;
|
||||
this.propertyRegistry = propertyRegistry;
|
||||
this.userManager = userManager;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
|
@ -28,7 +34,28 @@ public class NpcProcessorTask extends BukkitRunnable {
|
|||
EntityPropertyImpl<LookType> lookProperty = propertyRegistry.getByName("look", LookType.class);
|
||||
EntityPropertyImpl<Double> lookDistanceProperty = propertyRegistry.getByName("look_distance", Double.class);
|
||||
EntityPropertyImpl<Boolean> permissionRequiredProperty = propertyRegistry.getByName("permission_required", Boolean.class);
|
||||
EntityPropertyImpl<Boolean> playerKnockbackProperty = propertyRegistry.getByName("player_knockback", Boolean.class);
|
||||
EntityPropertyImpl<String> playerKnockbackExemptPermissionProperty = propertyRegistry.getByName("player_knockback_exempt_permission", String.class);
|
||||
EntityPropertyImpl<Double> playerKnockbackDistanceProperty = propertyRegistry.getByName("player_knockback_distance", Double.class);
|
||||
EntityPropertyImpl<Double> playerKnockbackVerticalProperty = propertyRegistry.getByName("player_knockback_vertical", Double.class);
|
||||
EntityPropertyImpl<Double> playerKnockbackHorizontalProperty = propertyRegistry.getByName("player_knockback_horizontal", Double.class);
|
||||
EntityPropertyImpl<Integer> playerKnockbackCooldownProperty = propertyRegistry.getByName("player_knockback_cooldown", Integer.class);
|
||||
EntityPropertyImpl<Boolean> playerKnockbackSoundProperty = propertyRegistry.getByName("player_knockback_sound", Boolean.class);
|
||||
EntityPropertyImpl<Sound> playerKnockbackSoundNameProperty = propertyRegistry.getByName("player_knockback_sound_name", Sound.class);
|
||||
EntityPropertyImpl<Float> playerKnockbackSoundVolumeProperty = propertyRegistry.getByName("player_knockback_sound_volume", Float.class);
|
||||
EntityPropertyImpl<Float> playerKnockbackSoundPitchProperty = propertyRegistry.getByName("player_knockback_sound_pitch", Float.class);
|
||||
double lookDistance;
|
||||
boolean permissionRequired;
|
||||
boolean playerKnockback;
|
||||
String playerKnockbackExemptPermission = null;
|
||||
double playerKnockbackDistance = 0;
|
||||
double playerKnockbackVertical = 0;
|
||||
double playerKnockbackHorizontal = 0;
|
||||
int playerKnockbackCooldown = 0;
|
||||
boolean playerKnockbackSound = false;
|
||||
Sound playerKnockbackSoundName = null;
|
||||
float playerKnockbackSoundVolume = 0;
|
||||
float playerKnockbackSoundPitch = 0;
|
||||
for (NpcEntryImpl entry : npcRegistry.getProcessable()) {
|
||||
NpcImpl npc = entry.getNpc();
|
||||
if (!npc.isEnabled()) continue;
|
||||
|
@ -37,7 +64,19 @@ public class NpcProcessorTask extends BukkitRunnable {
|
|||
Player closest = null;
|
||||
LookType lookType = npc.getProperty(lookProperty);
|
||||
lookDistance = NumberConversions.square(npc.getProperty(lookDistanceProperty));
|
||||
boolean permissionRequired = npc.getProperty(permissionRequiredProperty);
|
||||
permissionRequired = npc.getProperty(permissionRequiredProperty);
|
||||
playerKnockback = npc.getProperty(playerKnockbackProperty);
|
||||
if (playerKnockback) {
|
||||
playerKnockbackExemptPermission = npc.getProperty(playerKnockbackExemptPermissionProperty);
|
||||
playerKnockbackDistance = NumberConversions.square(npc.getProperty(playerKnockbackDistanceProperty));
|
||||
playerKnockbackVertical = npc.getProperty(playerKnockbackVerticalProperty);
|
||||
playerKnockbackHorizontal = npc.getProperty(playerKnockbackHorizontalProperty);
|
||||
playerKnockbackCooldown = npc.getProperty(playerKnockbackCooldownProperty);
|
||||
playerKnockbackSound = npc.getProperty(playerKnockbackSoundProperty);
|
||||
playerKnockbackSoundName = npc.getProperty(playerKnockbackSoundNameProperty);
|
||||
playerKnockbackSoundVolume = npc.getProperty(playerKnockbackSoundVolumeProperty);
|
||||
playerKnockbackSoundPitch = npc.getProperty(playerKnockbackSoundPitchProperty);
|
||||
}
|
||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||
if (!player.getWorld().equals(npc.getWorld())) {
|
||||
if (npc.isVisibleTo(player)) npc.hide(player);
|
||||
|
@ -71,6 +110,21 @@ public class NpcProcessorTask extends BukkitRunnable {
|
|||
NpcLocation expected = npc.getLocation().lookingAt(player.getLocation().add(0, -npc.getType().getHologramOffset(), 0));
|
||||
if (!expected.equals(npc.getLocation())) npc.setHeadRotation(player, expected.getYaw(), expected.getPitch());
|
||||
}
|
||||
|
||||
// player knockback
|
||||
User user = userManager.get(player.getUniqueId());
|
||||
if (playerKnockbackExemptPermission == null || !player.hasPermission(playerKnockbackExemptPermission)) {
|
||||
if (playerKnockback && distance <= playerKnockbackDistance && user.canKnockback(playerKnockbackCooldown)) {
|
||||
double x = npc.getLocation().getX() - player.getLocation().getX();
|
||||
double z = npc.getLocation().getZ() - player.getLocation().getZ();
|
||||
double angle = Math.atan2(z, x);
|
||||
double knockbackX = -Math.cos(angle) * playerKnockbackHorizontal;
|
||||
double knockbackZ = -Math.sin(angle) * playerKnockbackHorizontal;
|
||||
player.setVelocity(player.getVelocity().add(new Vector(knockbackX, playerKnockbackVertical, knockbackZ)));
|
||||
if (playerKnockbackSound)
|
||||
player.playSound(player.getLocation(), playerKnockbackSoundName, playerKnockbackSoundVolume, playerKnockbackSoundPitch);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// look property
|
||||
|
|
|
@ -11,6 +11,7 @@ import java.util.UUID;
|
|||
public class User {
|
||||
private final UUID uuid;
|
||||
private long lastNpcInteraction;
|
||||
private long lastNpcKnockback;
|
||||
private final Map<UUID, Long> actionCooldownMap = new HashMap<>();
|
||||
|
||||
public User(UUID uuid) {
|
||||
|
@ -29,6 +30,14 @@ public class User {
|
|||
return false;
|
||||
}
|
||||
|
||||
public boolean canKnockback(int cooldown) {
|
||||
if (System.currentTimeMillis() - lastNpcKnockback > cooldown) {
|
||||
lastNpcKnockback = System.currentTimeMillis();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public UUID getUuid() {
|
||||
return uuid;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue