mirror of
https://github.com/YatopiaMC/Yatopia.git
synced 2024-12-01 15:13:24 +01:00
0a19056af0
Fixes bad performance out of the box for production. Apparently there's another issue which is thinkering our minds up, it is that after certain amount of time the gc just can't keep up. We're investigating into this, but until it is fixed - this is gonna be a stable build Co-authored-by: Mykyta Komarn <nkomarn@hotmail.com>
171 lines
9.1 KiB
Diff
171 lines
9.1 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: tr7zw <tr7zw@live.de>
|
|
Date: Fri, 31 Jul 2020 21:58:24 -0500
|
|
Subject: [PATCH] Option for simpler Villagers
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/EntityVillager.java b/src/main/java/net/minecraft/server/EntityVillager.java
|
|
index 8c58564ee9397e549a51c1a7cb76156c26a82e0c..939ef3bd6439a68dba4224661d050c6af0164178 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityVillager.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityVillager.java
|
|
@@ -31,6 +31,7 @@ import org.bukkit.event.entity.VillagerReplenishTradeEvent;
|
|
|
|
public class EntityVillager extends EntityVillagerAbstract implements ReputationHandler, VillagerDataHolder {
|
|
|
|
+ private boolean simplerVillagerBehavior = net.yatopia.server.YatopiaConfig.simplerVillagerBehavior; // Yatopia - so we don't make them bork upon reload
|
|
private static final DataWatcherObject<VillagerData> br = DataWatcher.a(EntityVillager.class, DataWatcherRegistry.q);
|
|
public static final Map<Item, Integer> bp = ImmutableMap.of(Items.BREAD, 4, Items.POTATO, 1, Items.CARROT, 1, Items.BEETROOT, 1);
|
|
private static final Set<Item> bs = ImmutableSet.of(Items.BREAD, Items.POTATO, Items.CARROT, Items.WHEAT, Items.WHEAT_SEEDS, Items.BEETROOT, new Item[]{Items.BEETROOT_SEEDS});
|
|
@@ -67,13 +68,55 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation
|
|
public EntityVillager(EntityTypes<? extends EntityVillager> entitytypes, World world, VillagerType villagertype) {
|
|
super(entitytypes, world);
|
|
this.by = new Reputation();
|
|
+ if (!simplerVillagerBehavior) {
|
|
((Navigation) this.getNavigation()).a(true);
|
|
this.getNavigation().d(true);
|
|
+ // Yatopia start
|
|
+ } else {
|
|
+ initPathfinder();
|
|
+ }
|
|
+ // Yatopia end
|
|
this.setCanPickupLoot(true);
|
|
this.setVillagerData(this.getVillagerData().withType(villagertype).withProfession(VillagerProfession.NONE));
|
|
this.brainTickOffset = getRandom().nextInt(100); // Purpur
|
|
}
|
|
|
|
+ // Yatopia start
|
|
+ @Override
|
|
+ public void initPathfinder() {
|
|
+ if (!simplerVillagerBehavior) {
|
|
+ // safety
|
|
+ return;
|
|
+ }
|
|
+ this.goalSelector.a(0, new PathfinderGoalFloat(this));
|
|
+ if (net.yatopia.server.YatopiaConfig.villagersHideAtNight) {
|
|
+ this.goalSelector.a(0, new PathfinderGoalUseItem<>(this, PotionUtil.a(new ItemStack(Items.POTION), Potions.INVISIBILITY), SoundEffects.ENTITY_WANDERING_TRADER_DISAPPEARED, (entityvillagertrader) -> {
|
|
+ return !this.world.isDay() && !entityvillagertrader.isInvisible();
|
|
+ }));
|
|
+ this.goalSelector.a(0, new PathfinderGoalUseItem<>(this, new ItemStack(Items.MILK_BUCKET), SoundEffects.ENTITY_WANDERING_TRADER_REAPPEARED, (entityvillagertrader) -> {
|
|
+ return this.world.isDay() && entityvillagertrader.isInvisible();
|
|
+ }));
|
|
+ }
|
|
+ this.goalSelector.a(1, new PathfinderGoalTradeWithPlayer(this));
|
|
+ this.goalSelector.a(1, new PathfinderGoalAvoidTarget<>(this, EntityZombie.class, 8.0F, 0.5D, 0.5D));
|
|
+ this.goalSelector.a(1, new PathfinderGoalAvoidTarget<>(this, EntityEvoker.class, 12.0F, 0.5D, 0.5D));
|
|
+ this.goalSelector.a(1, new PathfinderGoalAvoidTarget<>(this, EntityVindicator.class, 8.0F, 0.5D, 0.5D));
|
|
+ this.goalSelector.a(1, new PathfinderGoalAvoidTarget<>(this, EntityVex.class, 8.0F, 0.5D, 0.5D));
|
|
+ this.goalSelector.a(1, new PathfinderGoalAvoidTarget<>(this, EntityPillager.class, 15.0F, 0.5D, 0.5D));
|
|
+ this.goalSelector.a(1, new PathfinderGoalAvoidTarget<>(this, EntityIllagerIllusioner.class, 12.0F, 0.5D, 0.5D));
|
|
+ this.goalSelector.a(1, new PathfinderGoalPanic(this, 0.5D));
|
|
+ this.goalSelector.a(1, new PathfinderGoalLookAtTradingPlayer(this));
|
|
+ this.goalSelector.a(2, new PathfinderGoalStrollVillageGolem(this, 0.6D));
|
|
+ this.goalSelector.a(3, new PathfinderGoalMoveThroughVillage(this, 0.6D, false, 4, () -> {
|
|
+ return false;
|
|
+ }));
|
|
+ this.goalSelector.a(4, new PathfinderGoalMoveTowardsRestriction(this, 0.35D));
|
|
+ this.goalSelector.a(8, new PathfinderGoalRandomStrollLand(this, 0.35D));
|
|
+ this.goalSelector.a(9, new PathfinderGoalInteract(this, EntityHuman.class, 3.0F, 1.0F));
|
|
+ this.goalSelector.a(10, new PathfinderGoalLookAtPlayer(this, EntityInsentient.class, 8.0F));
|
|
+ }
|
|
+ // Yatopia end
|
|
+
|
|
@Override
|
|
public BehaviorController<EntityVillager> getBehaviorController() {
|
|
return (BehaviorController<EntityVillager>) super.getBehaviorController(); // CraftBukkit - decompile error
|
|
@@ -86,6 +129,7 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation
|
|
|
|
@Override
|
|
protected BehaviorController<?> a(Dynamic<?> dynamic) {
|
|
+ if (simplerVillagerBehavior) return super.a(dynamic); // Yatopia
|
|
BehaviorController<EntityVillager> behaviorcontroller = this.cJ().a(dynamic);
|
|
|
|
this.a(behaviorcontroller);
|
|
@@ -171,10 +215,39 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation
|
|
}
|
|
// Spigot End
|
|
|
|
+ // Yatopia start
|
|
+ private VillagerProfession getRandomProfession() {
|
|
+ int type = random.nextInt(13);
|
|
+ switch(type) {
|
|
+ case 0: return VillagerProfession.ARMORER;
|
|
+ case 1: return VillagerProfession.BUTCHER;
|
|
+ case 2: return VillagerProfession.CARTOGRAPHER;
|
|
+ case 3: return VillagerProfession.CLERIC;
|
|
+ case 4: return VillagerProfession.FARMER;
|
|
+ case 5: return VillagerProfession.FISHERMAN;
|
|
+ case 6: return VillagerProfession.FLETCHER;
|
|
+ case 7: return VillagerProfession.LEATHERWORKER;
|
|
+ case 8: return VillagerProfession.LIBRARIAN;
|
|
+ case 9: return VillagerProfession.MASON;
|
|
+ case 10: return VillagerProfession.SHEPHERD;
|
|
+ case 11: return VillagerProfession.TOOLSMITH;
|
|
+ case 12: return VillagerProfession.WEAPONSMITH;
|
|
+ default: return VillagerProfession.FARMER;
|
|
+ }
|
|
+ }
|
|
+ // Yatopia end
|
|
+
|
|
@Override
|
|
protected void mobTick() { mobTick(false); }
|
|
protected void mobTick(boolean inactive) {
|
|
//this.world.getMethodProfiler().enter("villagerBrain"); // Akarin - remove caller
|
|
+ // Yatopia start
|
|
+ if (simplerVillagerBehavior && this.getVillagerData().getProfession() == VillagerProfession.NONE) {
|
|
+ this.setVillagerData(this.getVillagerData().withProfession(getRandomProfession()));
|
|
+ }
|
|
+ if (simplerVillagerBehavior && canRefresh()) restUses();
|
|
+ if (simplerVillagerBehavior) return;
|
|
+ // Yatopia end
|
|
// Purpur start
|
|
boolean tick = (world.getTime() + brainTickOffset) % world.purpurConfig.villagerBrainTicks == 0;
|
|
if (((WorldServer) world).getMinecraftServer().lagging ? tick : world.purpurConfig.villagerUseBrainTicksOnlyWhenLagging || tick)
|
|
@@ -344,6 +417,7 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation
|
|
return this.bD == 0 || this.bD < 2 && this.world.getTime() > this.bC + 2400L;
|
|
}
|
|
|
|
+ public final boolean canRefresh() { return fc(); } // Yatopia - OBFHELPER
|
|
public boolean fc() {
|
|
long i = this.bC + 12000L;
|
|
long j = this.world.getTime();
|
|
@@ -366,6 +440,7 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation
|
|
return this.fn() && this.fm();
|
|
}
|
|
|
|
+ public final void restUses() { fo(); } // Yatopia - OBFHELPER
|
|
private void fo() {
|
|
int i = 2 - this.bD;
|
|
|
|
@@ -596,6 +671,7 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation
|
|
}
|
|
|
|
private void a(Entity entity) {
|
|
+ if (simplerVillagerBehavior) return; // Yatopia
|
|
if (this.world instanceof WorldServer) {
|
|
Optional<List<EntityLiving>> optional = this.bg.getMemory(MemoryModuleType.VISIBLE_MOBS);
|
|
|
|
@@ -612,6 +688,7 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation
|
|
}
|
|
|
|
public void a(MemoryModuleType<GlobalPos> memorymoduletype) {
|
|
+ if (simplerVillagerBehavior) return;
|
|
if (this.world instanceof WorldServer) {
|
|
MinecraftServer minecraftserver = ((WorldServer) this.world).getMinecraftServer();
|
|
|
|
diff --git a/src/main/java/net/yatopia/server/YatopiaConfig.java b/src/main/java/net/yatopia/server/YatopiaConfig.java
|
|
index 9357d12cd623cd3ea92e39bd9d70ee89330ad1b3..eb53176099103172961d544c0dab17cc19ef2e7f 100644
|
|
--- a/src/main/java/net/yatopia/server/YatopiaConfig.java
|
|
+++ b/src/main/java/net/yatopia/server/YatopiaConfig.java
|
|
@@ -200,4 +200,11 @@ public class YatopiaConfig {
|
|
private static void itemStuckSleepTicks() {
|
|
itemStuckSleepTicks = getInt("settings.itemStuckSleepTicks", 1);
|
|
}
|
|
+
|
|
+ public static boolean simplerVillagerBehavior = false;
|
|
+ public static boolean villagersHideAtNight = false;
|
|
+ private static void villagerSettings() {
|
|
+ simplerVillagerBehavior = getBoolean("settings.villager.simplerVillagerBehavior", false);
|
|
+ villagersHideAtNight = getBoolean("settings.villager.villagersHideAtNight", false);
|
|
+ }
|
|
}
|