mirror of
https://github.com/LeavesMC/Leaves.git
synced 2025-12-19 14:59:32 +00:00
Fakeplayer Tick Type, fix knockback and piston SlimeBlock
This commit is contained in:
@@ -188,7 +188,7 @@ index 60425aade859c03ec21669b33d6b5096e444f6e9..9fba04e8a8e95546f7d7cc1210b4b324
|
|||||||
}
|
}
|
||||||
|
|
||||||
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
|
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
|
||||||
index 3de65c4025be91d938a350c884975cb6edc234d3..d0adf5df51dc47b1569e1ee2c307fe62933e145f 100644
|
index 3de65c4025be91d938a350c884975cb6edc234d3..339cec1f040d47bb37834c6ebe0633b7c991e0cd 100644
|
||||||
--- a/net/minecraft/server/level/ServerPlayer.java
|
--- a/net/minecraft/server/level/ServerPlayer.java
|
||||||
+++ b/net/minecraft/server/level/ServerPlayer.java
|
+++ b/net/minecraft/server/level/ServerPlayer.java
|
||||||
@@ -197,7 +197,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
@@ -197,7 +197,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||||
@@ -200,46 +200,7 @@ index 3de65c4025be91d938a350c884975cb6edc234d3..d0adf5df51dc47b1569e1ee2c307fe62
|
|||||||
private final PlayerAdvancements advancements;
|
private final PlayerAdvancements advancements;
|
||||||
private final ServerStatsCounter stats;
|
private final ServerStatsCounter stats;
|
||||||
private float lastRecordedHealthAndAbsorption = Float.MIN_VALUE;
|
private float lastRecordedHealthAndAbsorption = Float.MIN_VALUE;
|
||||||
@@ -811,16 +811,20 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
@@ -1469,6 +1469,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||||
this.invulnerableTime--;
|
|
||||||
}
|
|
||||||
|
|
||||||
- // Paper start - Configurable container update tick rate
|
|
||||||
- if (--this.containerUpdateDelay <= 0) {
|
|
||||||
- this.containerMenu.broadcastChanges();
|
|
||||||
- this.containerUpdateDelay = this.level().paperConfig().tickRates.containerUpdate;
|
|
||||||
- }
|
|
||||||
- // Paper end - Configurable container update tick rate
|
|
||||||
- if (this.containerMenu != this.inventoryMenu && (this.isImmobile() || !this.containerMenu.stillValid(this))) { // Paper - Prevent opening inventories when frozen
|
|
||||||
- this.closeContainer(org.bukkit.event.inventory.InventoryCloseEvent.Reason.CANT_USE); // Paper - Inventory close reason
|
|
||||||
- this.containerMenu = this.inventoryMenu;
|
|
||||||
+ // Leaves start - skip bot
|
|
||||||
+ if (!(this instanceof org.leavesmc.leaves.bot.ServerBot)) {
|
|
||||||
+ // Paper start - Configurable container update tick rate
|
|
||||||
+ if (--this.containerUpdateDelay <= 0) {
|
|
||||||
+ this.containerMenu.broadcastChanges();
|
|
||||||
+ this.containerUpdateDelay = this.level().paperConfig().tickRates.containerUpdate;
|
|
||||||
+ }
|
|
||||||
+ // Paper end - Configurable container update tick rate
|
|
||||||
+ if (this.containerMenu != this.inventoryMenu && (this.isImmobile() || !this.containerMenu.stillValid(this))) { // Paper - Prevent opening inventories when frozen
|
|
||||||
+ this.closeContainer(org.bukkit.event.inventory.InventoryCloseEvent.Reason.CANT_USE); // Paper - Inventory close reason
|
|
||||||
+ this.containerMenu = this.inventoryMenu;
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
+ // Leaves end - skip bot
|
|
||||||
|
|
||||||
Entity camera = this.getCamera();
|
|
||||||
if (camera != this) {
|
|
||||||
@@ -835,7 +839,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- CriteriaTriggers.TICK.trigger(this);
|
|
||||||
+ if (!(this instanceof org.leavesmc.leaves.bot.ServerBot)) CriteriaTriggers.TICK.trigger(this); // Leaves - skip bot
|
|
||||||
if (this.levitationStartPos != null) {
|
|
||||||
CriteriaTriggers.LEVITATION.trigger(this, this.levitationStartPos, this.tickCount - this.levitationStartTime);
|
|
||||||
}
|
|
||||||
@@ -1469,6 +1473,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
|
||||||
this.lastSentHealth = -1.0F;
|
this.lastSentHealth = -1.0F;
|
||||||
this.lastSentFood = -1;
|
this.lastSentFood = -1;
|
||||||
|
|
||||||
@@ -351,7 +312,7 @@ index e6bbcfed42233a31b72533c1f45b88b401b273a3..c599b8196d0eb72290081a533e565144
|
|||||||
final boolean yZero = movement.y == 0.0;
|
final boolean yZero = movement.y == 0.0;
|
||||||
final boolean zZero = movement.z == 0.0;
|
final boolean zZero = movement.z == 0.0;
|
||||||
diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java
|
diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java
|
||||||
index a0813aa9ebf5b32375b1bc9f294d8fc34cc867fe..6fa522d6935c277f2fc35bb772aa7b18b4adf6e3 100644
|
index a0813aa9ebf5b32375b1bc9f294d8fc34cc867fe..4ff40881c2d58881497794d2abb6efbfcd53d524 100644
|
||||||
--- a/net/minecraft/world/entity/player/Player.java
|
--- a/net/minecraft/world/entity/player/Player.java
|
||||||
+++ b/net/minecraft/world/entity/player/Player.java
|
+++ b/net/minecraft/world/entity/player/Player.java
|
||||||
@@ -186,7 +186,7 @@ public abstract class Player extends LivingEntity {
|
@@ -186,7 +186,7 @@ public abstract class Player extends LivingEntity {
|
||||||
@@ -385,6 +346,15 @@ index a0813aa9ebf5b32375b1bc9f294d8fc34cc867fe..6fa522d6935c277f2fc35bb772aa7b18
|
|||||||
entity.playerTouch(this);
|
entity.playerTouch(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1347,7 +1353,7 @@ public abstract class Player extends LivingEntity {
|
||||||
|
this.sweepAttack();
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (target instanceof ServerPlayer && target.hurtMarked) {
|
||||||
|
+ if ((target instanceof ServerPlayer && !(target instanceof org.leavesmc.leaves.bot.ServerBot)) && target.hurtMarked) { // Leaves - bot knockback
|
||||||
|
// CraftBukkit start - Add Velocity Event
|
||||||
|
boolean cancelled = false;
|
||||||
|
org.bukkit.entity.Player player = (org.bukkit.entity.Player) target.getBukkitEntity();
|
||||||
diff --git a/net/minecraft/world/entity/projectile/FishingHook.java b/net/minecraft/world/entity/projectile/FishingHook.java
|
diff --git a/net/minecraft/world/entity/projectile/FishingHook.java b/net/minecraft/world/entity/projectile/FishingHook.java
|
||||||
index 1e012c7ef699a64ff3f1b00f897bb893ab25ecbd..f2bf0cdbd29438ca51b74ae2fcdf49dba0d52804 100644
|
index 1e012c7ef699a64ff3f1b00f897bb893ab25ecbd..f2bf0cdbd29438ca51b74ae2fcdf49dba0d52804 100644
|
||||||
--- a/net/minecraft/world/entity/projectile/FishingHook.java
|
--- a/net/minecraft/world/entity/projectile/FishingHook.java
|
||||||
@@ -433,6 +403,19 @@ index acca8c51d2030c675c157b10d0bbc6af631afe61..b4721c4e81cc2ae989765d86bd51ebf0
|
|||||||
private boolean tryItemClickBehaviourOverride(Player player, ClickAction action, Slot slot, ItemStack clickedItem, ItemStack carriedItem) {
|
private boolean tryItemClickBehaviourOverride(Player player, ClickAction action, Slot slot, ItemStack clickedItem, ItemStack carriedItem) {
|
||||||
FeatureFlagSet featureFlagSet = player.level().enabledFeatures();
|
FeatureFlagSet featureFlagSet = player.level().enabledFeatures();
|
||||||
return carriedItem.isItemEnabled(featureFlagSet) && carriedItem.overrideStackedOnOther(slot, action, player)
|
return carriedItem.isItemEnabled(featureFlagSet) && carriedItem.overrideStackedOnOther(slot, action, player)
|
||||||
|
diff --git a/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java b/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java
|
||||||
|
index ee2f8e8deb35059824b5730a1442f383dc79f01c..190377ccd52458c6b490fad25983fe992b0aa0da 100644
|
||||||
|
--- a/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java
|
||||||
|
+++ b/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java
|
||||||
|
@@ -132,7 +132,7 @@ public class PistonMovingBlockEntity extends BlockEntity {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!(entity instanceof ServerPlayer)) {
|
||||||
|
+ if (!(entity instanceof ServerPlayer) || (entity instanceof org.leavesmc.leaves.bot.ServerBot)) { // Leaves - bot slime block
|
||||||
|
Vec3 deltaMovement = entity.getDeltaMovement();
|
||||||
|
double d1 = deltaMovement.x;
|
||||||
|
double d2 = deltaMovement.y;
|
||||||
diff --git a/net/minecraft/world/level/levelgen/PhantomSpawner.java b/net/minecraft/world/level/levelgen/PhantomSpawner.java
|
diff --git a/net/minecraft/world/level/levelgen/PhantomSpawner.java b/net/minecraft/world/level/levelgen/PhantomSpawner.java
|
||||||
index 11d25e64349b27bf54dc1620e4cce444c79f581c..82d9d53ef0aa57342173af29d14d00e4039fb583 100644
|
index 11d25e64349b27bf54dc1620e4cce444c79f581c..82d9d53ef0aa57342173af29d14d00e4039fb583 100644
|
||||||
--- a/net/minecraft/world/level/levelgen/PhantomSpawner.java
|
--- a/net/minecraft/world/level/levelgen/PhantomSpawner.java
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ Subject: [PATCH] Player operation limiter
|
|||||||
This patch is Powered by plusls-carpet-addition(https://github.com/plusls/plusls-carpet-addition)
|
This patch is Powered by plusls-carpet-addition(https://github.com/plusls/plusls-carpet-addition)
|
||||||
|
|
||||||
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
|
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
|
||||||
index d0adf5df51dc47b1569e1ee2c307fe62933e145f..f68ef6c8209b0bfa288800ac8bd42e1673bb4077 100644
|
index 339cec1f040d47bb37834c6ebe0633b7c991e0cd..b18a818e4d795b6fb269ad57ffb49840c8d879ab 100644
|
||||||
--- a/net/minecraft/server/level/ServerPlayer.java
|
--- a/net/minecraft/server/level/ServerPlayer.java
|
||||||
+++ b/net/minecraft/server/level/ServerPlayer.java
|
+++ b/net/minecraft/server/level/ServerPlayer.java
|
||||||
@@ -400,6 +400,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
@@ -400,6 +400,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||||
@@ -28,7 +28,7 @@ index d0adf5df51dc47b1569e1ee2c307fe62933e145f..f68ef6c8209b0bfa288800ac8bd42e16
|
|||||||
this.gameMode.tick();
|
this.gameMode.tick();
|
||||||
this.wardenSpawnTracker.tick();
|
this.wardenSpawnTracker.tick();
|
||||||
if (this.invulnerableTime > 0) {
|
if (this.invulnerableTime > 0) {
|
||||||
@@ -3094,4 +3099,31 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
@@ -3090,4 +3095,31 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||||
return (org.bukkit.craftbukkit.entity.CraftPlayer) super.getBukkitEntity();
|
return (org.bukkit.craftbukkit.entity.CraftPlayer) super.getBukkitEntity();
|
||||||
}
|
}
|
||||||
// CraftBukkit end
|
// CraftBukkit end
|
||||||
|
|||||||
@@ -6,10 +6,10 @@ Subject: [PATCH] MC Technical Survival Mode
|
|||||||
Will automatically overwrite some configuration after startup
|
Will automatically overwrite some configuration after startup
|
||||||
|
|
||||||
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
|
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
|
||||||
index f68ef6c8209b0bfa288800ac8bd42e1673bb4077..863bf19a9c235be422f6cafb2b77735076801181 100644
|
index b18a818e4d795b6fb269ad57ffb49840c8d879ab..0df1160ce4e027cc1c1bf7071a4d8730aaa7fde6 100644
|
||||||
--- a/net/minecraft/server/level/ServerPlayer.java
|
--- a/net/minecraft/server/level/ServerPlayer.java
|
||||||
+++ b/net/minecraft/server/level/ServerPlayer.java
|
+++ b/net/minecraft/server/level/ServerPlayer.java
|
||||||
@@ -1691,7 +1691,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
@@ -1687,7 +1687,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||||
public boolean isInvulnerableTo(ServerLevel level, DamageSource damageSource) {
|
public boolean isInvulnerableTo(ServerLevel level, DamageSource damageSource) {
|
||||||
return (super.isInvulnerableTo(level, damageSource) // Paper - disable player cramming;
|
return (super.isInvulnerableTo(level, damageSource) // Paper - disable player cramming;
|
||||||
|| this.isChangingDimension() && !damageSource.is(DamageTypes.ENDER_PEARL)
|
|| this.isChangingDimension() && !damageSource.is(DamageTypes.ENDER_PEARL)
|
||||||
|
|||||||
@@ -6,10 +6,10 @@ Subject: [PATCH] Return nether portal fix
|
|||||||
This patch is powered by NetherPortalFix(https://github.com/TwelveIterationMods/NetherPortalFix)
|
This patch is powered by NetherPortalFix(https://github.com/TwelveIterationMods/NetherPortalFix)
|
||||||
|
|
||||||
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
|
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
|
||||||
index 863bf19a9c235be422f6cafb2b77735076801181..ad7df15ad454d896f9b243bad973dcf8496a06af 100644
|
index 0df1160ce4e027cc1c1bf7071a4d8730aaa7fde6..eba1717566a8ea534bbf149e0593cc7656df2db9 100644
|
||||||
--- a/net/minecraft/server/level/ServerPlayer.java
|
--- a/net/minecraft/server/level/ServerPlayer.java
|
||||||
+++ b/net/minecraft/server/level/ServerPlayer.java
|
+++ b/net/minecraft/server/level/ServerPlayer.java
|
||||||
@@ -1488,6 +1488,21 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
@@ -1484,6 +1484,21 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||||
org.bukkit.event.player.PlayerChangedWorldEvent changeEvent = new org.bukkit.event.player.PlayerChangedWorldEvent(this.getBukkitEntity(), serverLevel.getWorld());
|
org.bukkit.event.player.PlayerChangedWorldEvent changeEvent = new org.bukkit.event.player.PlayerChangedWorldEvent(this.getBukkitEntity(), serverLevel.getWorld());
|
||||||
this.level().getCraftServer().getPluginManager().callEvent(changeEvent);
|
this.level().getCraftServer().getPluginManager().callEvent(changeEvent);
|
||||||
// CraftBukkit end
|
// CraftBukkit end
|
||||||
|
|||||||
@@ -7,21 +7,25 @@ import net.minecraft.server.level.ServerLevel;
|
|||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.configuration.file.YamlConfiguration;
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.leavesmc.leaves.bot.ServerBot;
|
||||||
import org.leavesmc.leaves.command.LeavesCommand;
|
import org.leavesmc.leaves.command.LeavesCommand;
|
||||||
|
import org.leavesmc.leaves.config.ConfigValidatorImpl.BooleanConfigValidator;
|
||||||
|
import org.leavesmc.leaves.config.ConfigValidatorImpl.DoubleConfigValidator;
|
||||||
|
import org.leavesmc.leaves.config.ConfigValidatorImpl.EnumConfigValidator;
|
||||||
|
import org.leavesmc.leaves.config.ConfigValidatorImpl.IntConfigValidator;
|
||||||
|
import org.leavesmc.leaves.config.ConfigValidatorImpl.ListConfigValidator;
|
||||||
|
import org.leavesmc.leaves.config.ConfigValidatorImpl.StringConfigValidator;
|
||||||
|
import org.leavesmc.leaves.config.GlobalConfigManager;
|
||||||
import org.leavesmc.leaves.config.annotations.GlobalConfig;
|
import org.leavesmc.leaves.config.annotations.GlobalConfig;
|
||||||
import org.leavesmc.leaves.config.annotations.GlobalConfigCategory;
|
import org.leavesmc.leaves.config.annotations.GlobalConfigCategory;
|
||||||
import org.leavesmc.leaves.config.annotations.RemovedConfig;
|
import org.leavesmc.leaves.config.annotations.RemovedConfig;
|
||||||
import org.leavesmc.leaves.config.GlobalConfigManager;
|
import org.leavesmc.leaves.protocol.CarpetServerProtocol.CarpetRule;
|
||||||
|
import org.leavesmc.leaves.protocol.CarpetServerProtocol.CarpetRules;
|
||||||
|
import org.leavesmc.leaves.protocol.bladeren.BladerenProtocol.LeavesFeature;
|
||||||
|
import org.leavesmc.leaves.protocol.bladeren.BladerenProtocol.LeavesFeatureSet;
|
||||||
import org.leavesmc.leaves.region.RegionFileFormat;
|
import org.leavesmc.leaves.region.RegionFileFormat;
|
||||||
import org.leavesmc.leaves.util.MathUtils;
|
import org.leavesmc.leaves.util.MathUtils;
|
||||||
|
|
||||||
import org.leavesmc.leaves.config.ConfigValidatorImpl.BooleanConfigValidator;
|
|
||||||
import org.leavesmc.leaves.config.ConfigValidatorImpl.IntConfigValidator;
|
|
||||||
import org.leavesmc.leaves.config.ConfigValidatorImpl.StringConfigValidator;
|
|
||||||
import org.leavesmc.leaves.config.ConfigValidatorImpl.DoubleConfigValidator;
|
|
||||||
import org.leavesmc.leaves.config.ConfigValidatorImpl.ListConfigValidator;
|
|
||||||
import org.leavesmc.leaves.config.ConfigValidatorImpl.EnumConfigValidator;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@@ -29,12 +33,6 @@ import java.util.List;
|
|||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
import org.leavesmc.leaves.protocol.CarpetServerProtocol.CarpetRule;
|
|
||||||
import org.leavesmc.leaves.protocol.CarpetServerProtocol.CarpetRules;
|
|
||||||
|
|
||||||
import org.leavesmc.leaves.protocol.bladeren.BladerenProtocol.LeavesFeatureSet;
|
|
||||||
import org.leavesmc.leaves.protocol.bladeren.BladerenProtocol.LeavesFeature;
|
|
||||||
|
|
||||||
public final class LeavesConfig {
|
public final class LeavesConfig {
|
||||||
|
|
||||||
public static final String CONFIG_HEADER = "Configuration file for Leaves.";
|
public static final String CONFIG_HEADER = "Configuration file for Leaves.";
|
||||||
@@ -188,6 +186,9 @@ public final class LeavesConfig {
|
|||||||
|
|
||||||
@GlobalConfig(value = "cache-skin", lock = true)
|
@GlobalConfig(value = "cache-skin", lock = true)
|
||||||
public boolean useSkinCache = false;
|
public boolean useSkinCache = false;
|
||||||
|
|
||||||
|
@GlobalConfig(value = "tick-type")
|
||||||
|
public ServerBot.TickType tickType = ServerBot.TickType.NETWORK;
|
||||||
}
|
}
|
||||||
|
|
||||||
public MinecraftOLDConfig oldMC = new MinecraftOLDConfig();
|
public MinecraftOLDConfig oldMC = new MinecraftOLDConfig();
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import org.bukkit.craftbukkit.CraftWorld;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.leavesmc.leaves.LeavesConfig;
|
import org.leavesmc.leaves.LeavesConfig;
|
||||||
|
import org.leavesmc.leaves.bot.agent.Configs;
|
||||||
import org.leavesmc.leaves.event.bot.BotCreateEvent;
|
import org.leavesmc.leaves.event.bot.BotCreateEvent;
|
||||||
import org.leavesmc.leaves.event.bot.BotJoinEvent;
|
import org.leavesmc.leaves.event.bot.BotJoinEvent;
|
||||||
import org.leavesmc.leaves.event.bot.BotLoadEvent;
|
import org.leavesmc.leaves.event.bot.BotLoadEvent;
|
||||||
@@ -248,7 +249,7 @@ public class BotList {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void networkTick() {
|
public void networkTick() {
|
||||||
this.bots.forEach(ServerBot::doTick);
|
this.bots.stream().filter(bot -> bot.getConfigValue(Configs.TICK_TYPE) == ServerBot.TickType.NETWORK).forEach(ServerBot::doTick); // TODO perf?
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package org.leavesmc.leaves.bot;
|
|||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.mojang.authlib.GameProfile;
|
import com.mojang.authlib.GameProfile;
|
||||||
import io.papermc.paper.adventure.PaperAdventure;
|
import io.papermc.paper.adventure.PaperAdventure;
|
||||||
import io.papermc.paper.event.entity.EntityKnockbackEvent;
|
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.core.particles.BlockParticleOption;
|
import net.minecraft.core.particles.BlockParticleOption;
|
||||||
import net.minecraft.core.particles.ParticleTypes;
|
import net.minecraft.core.particles.ParticleTypes;
|
||||||
@@ -40,7 +39,6 @@ import net.minecraft.world.level.block.state.BlockState;
|
|||||||
import net.minecraft.world.level.gameevent.GameEvent;
|
import net.minecraft.world.level.gameevent.GameEvent;
|
||||||
import net.minecraft.world.level.portal.TeleportTransition;
|
import net.minecraft.world.level.portal.TeleportTransition;
|
||||||
import net.minecraft.world.phys.EntityHitResult;
|
import net.minecraft.world.phys.EntityHitResult;
|
||||||
import net.minecraft.world.phys.Vec3;
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
@@ -72,8 +70,8 @@ import java.util.function.Predicate;
|
|||||||
|
|
||||||
public class ServerBot extends ServerPlayer {
|
public class ServerBot extends ServerPlayer {
|
||||||
|
|
||||||
private final Map<Configs<?>, AbstractBotConfig<?>> configs;
|
|
||||||
private final List<AbstractBotAction<?>> actions;
|
private final List<AbstractBotAction<?>> actions;
|
||||||
|
private final Map<Configs<?>, AbstractBotConfig<?>> configs;
|
||||||
|
|
||||||
public boolean resume = false;
|
public boolean resume = false;
|
||||||
public BotCreateState createState;
|
public BotCreateState createState;
|
||||||
@@ -87,15 +85,13 @@ public class ServerBot extends ServerPlayer {
|
|||||||
|
|
||||||
public int removeTaskId = -1;
|
public int removeTaskId = -1;
|
||||||
|
|
||||||
private Vec3 knockback = Vec3.ZERO;
|
|
||||||
|
|
||||||
public ServerBot(MinecraftServer server, ServerLevel world, GameProfile profile) {
|
public ServerBot(MinecraftServer server, ServerLevel world, GameProfile profile) {
|
||||||
super(server, world, profile, ClientInformation.createDefault());
|
super(server, world, profile, ClientInformation.createDefault());
|
||||||
this.entityData.set(Player.DATA_PLAYER_MODE_CUSTOMISATION, (byte) -2);
|
this.entityData.set(Player.DATA_PLAYER_MODE_CUSTOMISATION, (byte) -2);
|
||||||
|
|
||||||
this.gameMode = new ServerBotGameMode(this);
|
this.gameMode = new ServerBotGameMode(this);
|
||||||
this.actions = new ArrayList<>();
|
|
||||||
|
|
||||||
|
this.actions = new ArrayList<>();
|
||||||
ImmutableMap.Builder<Configs<?>, AbstractBotConfig<?>> configBuilder = ImmutableMap.builder();
|
ImmutableMap.Builder<Configs<?>, AbstractBotConfig<?>> configBuilder = ImmutableMap.builder();
|
||||||
for (Configs<?> config : Configs.getConfigs()) {
|
for (Configs<?> config : Configs.getConfigs()) {
|
||||||
configBuilder.put(config, config.createConfig(this));
|
configBuilder.put(config, config.createConfig(this));
|
||||||
@@ -108,78 +104,112 @@ public class ServerBot extends ServerPlayer {
|
|||||||
|
|
||||||
this.notSleepTicks = 0;
|
this.notSleepTicks = 0;
|
||||||
this.fauxSleeping = LeavesConfig.modify.fakeplayer.canSkipSleep;
|
this.fauxSleeping = LeavesConfig.modify.fakeplayer.canSkipSleep;
|
||||||
}
|
this.setClientLoaded(true);
|
||||||
|
|
||||||
public void sendPlayerInfo(ServerPlayer player) {
|
|
||||||
player.connection.send(new ClientboundPlayerInfoUpdatePacket(EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER, ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LISTED, ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME), List.of(this)));
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean needSendFakeData(ServerPlayer player) {
|
|
||||||
return this.getConfigValue(Configs.ALWAYS_SEND_DATA) && (player.level() == this.level() && player.position().distanceToSqr(this.position()) > this.tracingRange);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void sendFakeDataIfNeed(ServerPlayer player, boolean login) {
|
|
||||||
if (needSendFakeData(player)) {
|
|
||||||
this.sendFakeData(player.connection, login);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void sendFakeData(ServerPlayerConnection playerConnection, boolean login) {
|
|
||||||
ChunkMap.TrackedEntity entityTracker = ((ServerLevel) this.level()).getChunkSource().chunkMap.entityMap.get(this.getId());
|
|
||||||
|
|
||||||
if (entityTracker == null) {
|
|
||||||
LeavesLogger.LOGGER.warning("Fakeplayer cant get entity tracker for " + this.getId());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
playerConnection.send(this.getAddEntityPacket(entityTracker.serverEntity));
|
|
||||||
if (login) {
|
|
||||||
Bukkit.getScheduler().runTaskLater(MinecraftInternalPlugin.INSTANCE, () -> playerConnection.send(new ClientboundRotateHeadPacket(this, (byte) ((getYRot() * 256f) / 360f))), 10);
|
|
||||||
} else {
|
|
||||||
playerConnection.send(new ClientboundRotateHeadPacket(this, (byte) ((getYRot() * 256f) / 360f)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void renderAll() {
|
|
||||||
this.server.getPlayerList().getPlayers().forEach(
|
|
||||||
player -> {
|
|
||||||
this.sendPlayerInfo(player);
|
|
||||||
this.sendFakeDataIfNeed(player, false);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void sendPacket(Packet<?> packet) {
|
|
||||||
this.server.getPlayerList().getPlayers().forEach(player -> player.connection.send(packet));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void die(@NotNull DamageSource damageSource) {
|
public void tick() {
|
||||||
boolean flag = this.serverLevel().getGameRules().getBoolean(GameRules.RULE_SHOWDEATHMESSAGES);
|
if (!this.isAlive()) {
|
||||||
Component defaultMessage = this.getCombatTracker().getDeathMessage();
|
|
||||||
|
|
||||||
BotDeathEvent event = new BotDeathEvent(this.getBukkitEntity(), PaperAdventure.asAdventure(defaultMessage), flag);
|
|
||||||
this.server.server.getPluginManager().callEvent(event);
|
|
||||||
|
|
||||||
if (event.isCancelled()) {
|
|
||||||
if (this.getHealth() <= 0) {
|
|
||||||
this.setHealth(0.1f);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.gameEvent(GameEvent.ENTITY_DIE);
|
if (this.getConfigValue(Configs.TICK_TYPE) == TickType.ENTITY_LIST) {
|
||||||
|
this.runAction();
|
||||||
net.kyori.adventure.text.Component deathMessage = event.deathMessage();
|
|
||||||
if (event.isSendDeathMessage() && deathMessage != null && !deathMessage.equals(net.kyori.adventure.text.Component.empty())) {
|
|
||||||
this.server.getPlayerList().broadcastSystemMessage(PaperAdventure.asVanilla(deathMessage), false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.server.getBotList().removeBot(this, BotRemoveEvent.RemoveReason.DEATH, null, false);
|
// copy ServerPlayer start
|
||||||
|
if (this.joining) {
|
||||||
|
this.joining = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.gameMode.tick();
|
||||||
|
this.wardenSpawnTracker.tick();
|
||||||
|
if (this.invulnerableTime > 0) {
|
||||||
|
this.invulnerableTime--;
|
||||||
|
}
|
||||||
|
// copy ServerPlayer end
|
||||||
|
|
||||||
|
if (this.getConfigValue(Configs.SPAWN_PHANTOM)) {
|
||||||
|
notSleepTicks++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (LeavesConfig.modify.fakeplayer.regenAmount > 0.0 && server.getTickCount() % 20 == 0) {
|
||||||
|
float health = getHealth();
|
||||||
|
float maxHealth = getMaxHealth();
|
||||||
|
float regenAmount = (float) (LeavesConfig.modify.fakeplayer.regenAmount * 20);
|
||||||
|
float amount;
|
||||||
|
|
||||||
|
if (health < maxHealth - regenAmount) {
|
||||||
|
amount = health + regenAmount;
|
||||||
|
} else {
|
||||||
|
amount = maxHealth;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setHealth(amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.getConfigValue(Configs.TICK_TYPE) == TickType.ENTITY_LIST) {
|
||||||
|
this.doTick();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeTab() {
|
@Override
|
||||||
this.sendPacket(new ClientboundPlayerInfoRemovePacket(List.of(this.getUUID())));
|
public void doTick() {
|
||||||
|
this.absMoveTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot());
|
||||||
|
|
||||||
|
if (this.isPassenger()) {
|
||||||
|
this.setOnGround(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.takeXpDelay > 0) {
|
||||||
|
--this.takeXpDelay;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.isSleeping()) {
|
||||||
|
++this.sleepCounter;
|
||||||
|
if (this.sleepCounter > 100) {
|
||||||
|
this.sleepCounter = 100;
|
||||||
|
this.notSleepTicks = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.level().isClientSide && this.level().isDay()) {
|
||||||
|
this.stopSleepInBed(false, true);
|
||||||
|
}
|
||||||
|
} else if (this.sleepCounter > 0) {
|
||||||
|
++this.sleepCounter;
|
||||||
|
if (this.sleepCounter >= 110) {
|
||||||
|
this.sleepCounter = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.updateIsUnderwater();
|
||||||
|
|
||||||
|
if (this.getConfigValue(Configs.TICK_TYPE) == TickType.NETWORK) {
|
||||||
|
this.server.scheduleOnMain(this::runAction);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.livingEntityTick();
|
||||||
|
|
||||||
|
this.foodData.tick(this);
|
||||||
|
|
||||||
|
double d = Mth.clamp(this.getX(), -2.9999999E7, 2.9999999E7);
|
||||||
|
double d1 = Mth.clamp(this.getZ(), -2.9999999E7, 2.9999999E7);
|
||||||
|
if (d != this.getX() || d1 != this.getZ()) {
|
||||||
|
this.setPos(d, this.getY(), d1);
|
||||||
|
}
|
||||||
|
|
||||||
|
++this.attackStrengthTicker;
|
||||||
|
ItemStack itemstack = this.getMainHandItem();
|
||||||
|
if (!ItemStack.matches(this.lastItemInMainHand, itemstack)) {
|
||||||
|
if (!ItemStack.isSameItem(this.lastItemInMainHand, itemstack)) {
|
||||||
|
this.resetAttackStrengthTicker();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.lastItemInMainHand = itemstack.copy();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.getCooldowns().tick();
|
||||||
|
this.updatePlayerPose();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -205,33 +235,6 @@ public class ServerBot extends ServerPlayer {
|
|||||||
public void handlePortal() {
|
public void handlePortal() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void tick() {
|
|
||||||
if (!this.isAlive()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
super.tick();
|
|
||||||
|
|
||||||
if (this.getConfigValue(Configs.SPAWN_PHANTOM)) {
|
|
||||||
notSleepTicks++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (LeavesConfig.modify.fakeplayer.regenAmount > 0.0 && server.getTickCount() % 20 == 0) {
|
|
||||||
float health = getHealth();
|
|
||||||
float maxHealth = getMaxHealth();
|
|
||||||
float regenAmount = (float) (LeavesConfig.modify.fakeplayer.regenAmount * 20);
|
|
||||||
float amount;
|
|
||||||
|
|
||||||
if (health < maxHealth - regenAmount) {
|
|
||||||
amount = health + regenAmount;
|
|
||||||
} else {
|
|
||||||
amount = maxHealth;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.setHealth(amount);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onItemPickup(@NotNull ItemEntity item) {
|
public void onItemPickup(@NotNull ItemEntity item) {
|
||||||
super.onItemPickup(item);
|
super.onItemPickup(item);
|
||||||
@@ -305,71 +308,6 @@ public class ServerBot extends ServerPlayer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void doTick() {
|
|
||||||
this.absMoveTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot());
|
|
||||||
|
|
||||||
if (this.takeXpDelay > 0) {
|
|
||||||
--this.takeXpDelay;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.isSleeping()) {
|
|
||||||
++this.sleepCounter;
|
|
||||||
if (this.sleepCounter > 100) {
|
|
||||||
this.sleepCounter = 100;
|
|
||||||
this.notSleepTicks = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!this.level().isClientSide && this.level().isDay()) {
|
|
||||||
this.stopSleepInBed(false, true);
|
|
||||||
}
|
|
||||||
} else if (this.sleepCounter > 0) {
|
|
||||||
++this.sleepCounter;
|
|
||||||
if (this.sleepCounter >= 110) {
|
|
||||||
this.sleepCounter = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.updateIsUnderwater();
|
|
||||||
|
|
||||||
this.addDeltaMovement(knockback);
|
|
||||||
this.knockback = Vec3.ZERO;
|
|
||||||
|
|
||||||
this.server.scheduleOnMain(this::runAction);
|
|
||||||
|
|
||||||
this.livingEntityTick();
|
|
||||||
|
|
||||||
this.foodData.tick(this);
|
|
||||||
|
|
||||||
++this.attackStrengthTicker;
|
|
||||||
ItemStack itemstack = this.getMainHandItem();
|
|
||||||
if (!ItemStack.matches(this.lastItemInMainHand, itemstack)) {
|
|
||||||
if (!ItemStack.isSameItem(this.lastItemInMainHand, itemstack)) {
|
|
||||||
this.resetAttackStrengthTicker();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.lastItemInMainHand = itemstack.copy();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.getCooldowns().tick();
|
|
||||||
this.updatePlayerPose();
|
|
||||||
|
|
||||||
if (this.hurtTime > 0) {
|
|
||||||
this.hurtTime -= 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void knockback(double strength, double x, double z, @Nullable Entity attacker, @NotNull EntityKnockbackEvent.Cause cause) {
|
|
||||||
strength *= 1.0D - this.getAttributeValue(Attributes.KNOCKBACK_RESISTANCE);
|
|
||||||
if (strength > 0.0D) {
|
|
||||||
Vec3 vec3d = this.getDeltaMovement();
|
|
||||||
Vec3 vec3d1 = (new Vec3(x, 0.0D, z)).normalize().scale(strength);
|
|
||||||
this.hasImpulse = true;
|
|
||||||
this.knockback = new Vec3(vec3d.x / 2.0D - vec3d1.x, this.onGround() ? Math.min(0.4D, vec3d.y / 2.0D + strength) : vec3d.y, vec3d.z / 2.0D - vec3d1.z).subtract(vec3d);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void attack(@NotNull Entity target) {
|
public void attack(@NotNull Entity target) {
|
||||||
super.attack(target);
|
super.attack(target);
|
||||||
@@ -462,6 +400,78 @@ public class ServerBot extends ServerPlayer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void sendPlayerInfo(ServerPlayer player) {
|
||||||
|
player.connection.send(new ClientboundPlayerInfoUpdatePacket(EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER, ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LISTED, ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME), List.of(this)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean needSendFakeData(ServerPlayer player) {
|
||||||
|
return this.getConfigValue(Configs.ALWAYS_SEND_DATA) && (player.level() == this.level() && player.position().distanceToSqr(this.position()) > this.tracingRange);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendFakeDataIfNeed(ServerPlayer player, boolean login) {
|
||||||
|
if (needSendFakeData(player)) {
|
||||||
|
this.sendFakeData(player.connection, login);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendFakeData(ServerPlayerConnection playerConnection, boolean login) {
|
||||||
|
ChunkMap.TrackedEntity entityTracker = ((ServerLevel) this.level()).getChunkSource().chunkMap.entityMap.get(this.getId());
|
||||||
|
|
||||||
|
if (entityTracker == null) {
|
||||||
|
LeavesLogger.LOGGER.warning("Fakeplayer cant get entity tracker for " + this.getId());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
playerConnection.send(this.getAddEntityPacket(entityTracker.serverEntity));
|
||||||
|
if (login) {
|
||||||
|
Bukkit.getScheduler().runTaskLater(MinecraftInternalPlugin.INSTANCE, () -> playerConnection.send(new ClientboundRotateHeadPacket(this, (byte) ((getYRot() * 256f) / 360f))), 10);
|
||||||
|
} else {
|
||||||
|
playerConnection.send(new ClientboundRotateHeadPacket(this, (byte) ((getYRot() * 256f) / 360f)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void renderAll() {
|
||||||
|
this.server.getPlayerList().getPlayers().forEach(
|
||||||
|
player -> {
|
||||||
|
this.sendPlayerInfo(player);
|
||||||
|
this.sendFakeDataIfNeed(player, false);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendPacket(Packet<?> packet) {
|
||||||
|
this.server.getPlayerList().getPlayers().forEach(player -> player.connection.send(packet));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void die(@NotNull DamageSource damageSource) {
|
||||||
|
boolean flag = this.serverLevel().getGameRules().getBoolean(GameRules.RULE_SHOWDEATHMESSAGES);
|
||||||
|
Component defaultMessage = this.getCombatTracker().getDeathMessage();
|
||||||
|
|
||||||
|
BotDeathEvent event = new BotDeathEvent(this.getBukkitEntity(), PaperAdventure.asAdventure(defaultMessage), flag);
|
||||||
|
this.server.server.getPluginManager().callEvent(event);
|
||||||
|
|
||||||
|
if (event.isCancelled()) {
|
||||||
|
if (this.getHealth() <= 0) {
|
||||||
|
this.setHealth(0.1f);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.gameEvent(GameEvent.ENTITY_DIE);
|
||||||
|
|
||||||
|
net.kyori.adventure.text.Component deathMessage = event.deathMessage();
|
||||||
|
if (event.isSendDeathMessage() && deathMessage != null && !deathMessage.equals(net.kyori.adventure.text.Component.empty())) {
|
||||||
|
this.server.getPlayerList().broadcastSystemMessage(PaperAdventure.asVanilla(deathMessage), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.server.getBotList().removeBot(this, BotRemoveEvent.RemoveReason.DEATH, null, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeTab() {
|
||||||
|
this.sendPacket(new ClientboundPlayerInfoRemovePacket(List.of(this.getUUID())));
|
||||||
|
}
|
||||||
|
|
||||||
public void faceLocation(@NotNull Location loc) {
|
public void faceLocation(@NotNull Location loc) {
|
||||||
this.look(loc.toVector().subtract(getLocation().toVector()), false);
|
this.look(loc.toVector().subtract(getLocation().toVector()), false);
|
||||||
}
|
}
|
||||||
@@ -531,7 +541,8 @@ public class ServerBot extends ServerPlayer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NotNull ServerStatsCounter getStats() {
|
@NotNull
|
||||||
|
public ServerStatsCounter getStats() {
|
||||||
return stats;
|
return stats;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -549,4 +560,9 @@ public class ServerBot extends ServerPlayer {
|
|||||||
public CraftBot getBukkitEntity() {
|
public CraftBot getBukkitEntity() {
|
||||||
return (CraftBot) super.getBukkitEntity();
|
return (CraftBot) super.getBukkitEntity();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum TickType {
|
||||||
|
NETWORK,
|
||||||
|
ENTITY_LIST
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ public class Configs<E> {
|
|||||||
public static final Configs<Boolean> ALWAYS_SEND_DATA = register(AlwaysSendDataConfig.class, AlwaysSendDataConfig::new);
|
public static final Configs<Boolean> ALWAYS_SEND_DATA = register(AlwaysSendDataConfig.class, AlwaysSendDataConfig::new);
|
||||||
public static final Configs<Boolean> SPAWN_PHANTOM = register(SpawnPhantomConfig.class, SpawnPhantomConfig::new);
|
public static final Configs<Boolean> SPAWN_PHANTOM = register(SpawnPhantomConfig.class, SpawnPhantomConfig::new);
|
||||||
public static final Configs<Integer> SIMULATION_DISTANCE = register(SimulationDistanceConfig.class, SimulationDistanceConfig::new);
|
public static final Configs<Integer> SIMULATION_DISTANCE = register(SimulationDistanceConfig.class, SimulationDistanceConfig::new);
|
||||||
|
public static final Configs<ServerBot.TickType> TICK_TYPE = register(TickTypeConfig.class, TickTypeConfig::new);
|
||||||
|
|
||||||
private final Class<? extends AbstractBotConfig<E>> configClass;
|
private final Class<? extends AbstractBotConfig<E>> configClass;
|
||||||
private final Supplier<? extends AbstractBotConfig<E>> configCreator;
|
private final Supplier<? extends AbstractBotConfig<E>> configCreator;
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
package org.leavesmc.leaves.bot.agent.configs;
|
||||||
|
|
||||||
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.leavesmc.leaves.LeavesConfig;
|
||||||
|
import org.leavesmc.leaves.bot.ServerBot;
|
||||||
|
import org.leavesmc.leaves.bot.agent.AbstractBotConfig;
|
||||||
|
import org.leavesmc.leaves.command.CommandArgument;
|
||||||
|
import org.leavesmc.leaves.command.CommandArgumentType;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class TickTypeConfig extends AbstractBotConfig<ServerBot.TickType> {
|
||||||
|
|
||||||
|
private static final String NAME = "tick_type";
|
||||||
|
private static final CommandArgumentType<ServerBot.TickType> TICK_TYPE_ARGUMENT = CommandArgumentType.of(ServerBot.TickType.class, (string -> ServerBot.TickType.valueOf(string.toUpperCase())));
|
||||||
|
|
||||||
|
private ServerBot.TickType value;
|
||||||
|
|
||||||
|
public TickTypeConfig() {
|
||||||
|
super(NAME, CommandArgument.of(TICK_TYPE_ARGUMENT).setTabComplete(0, List.of("network", "entity_list")));
|
||||||
|
this.value = LeavesConfig.modify.fakeplayer.tickType;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ServerBot.TickType getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setValue(ServerBot.TickType value) throws IllegalArgumentException {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NotNull
|
||||||
|
public CompoundTag save(@NotNull CompoundTag nbt) {
|
||||||
|
super.save(nbt);
|
||||||
|
nbt.putString(NAME, this.getValue().toString());
|
||||||
|
return nbt;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void load(@NotNull CompoundTag nbt) {
|
||||||
|
this.setValue(TICK_TYPE_ARGUMENT.parse(nbt.getString(NAME)));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user