Uploaded image for project: 'Minecraft: Java Edition'
  1. Minecraft: Java Edition
  2. MC-245686

Villagers can't restock trades when doDaylightCycle is false

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Unresolved
    • None
    • 1.18.1, 1.19.2
    • None
    • Confirmed
    • Village system
    • Normal
    • Gameplay

      The Bug

      I'm playing on my own server and have the gamerule doDaylightCycle set to false. The Villagers I'm trading with will no longer refresh their trades after a certain amount of trading has been done. Only activating the daylight cycle again and waiting a bit seems to fix the issue.

      Reproduce

      • Spawn a villager and give it a profession
      • Do /gamerule doDaylightCycle false
      • Trade with the villager multiple times (it should restock a few times so keep trading until it stops restocking)

      Observed Result

      The villager stopped restocking

      Expected Result

      The villager would continue to restock when doDaylightCycle is false since it can't sleep to restock

      Code Analysis and Fix

      Code Analysis provided by thumpbacker
      Simply running a check of the doDaylightCycle gamerule in the shouldRestock boolean method in the Villager class fixes this issue.

      Current Code

      net/minecraft/world/entity/npc/Villager.java
         public boolean shouldRestock() {
            long i = this.lastRestockGameTime + 12000L;
            long j = this.level.getGameTime();
            boolean flag = j > i;
            long k = this.level.getDayTime();
            if (this.lastRestockCheckDayTime > 0L) {
               long l = this.lastRestockCheckDayTime / 24000L;
               long i1 = k / 24000L;
               flag |= i1 > l;
            }
      
            this.lastRestockCheckDayTime = k;
            //Check for gamerule here to fix MC-245686
            if (flag) {
               this.lastRestockGameTime = j;
               this.resetNumberOfRestocks();
            }
      
            return this.allowedToRestock() && this.needsToRestock();
         }
      

      Fixed Code

      net/minecraft/world/entity/npc/Villager.java
         public boolean shouldRestock() {
            long i = this.lastRestockGameTime + 12000L;
            long j = this.level.getGameTime();
            boolean flag = j > i;
            long k = this.level.getDayTime();
            if (this.lastRestockCheckDayTime > 0L) {
               long l = this.lastRestockCheckDayTime / 24000L;
               long i1 = k / 24000L;
               flag |= i1 > l;
            }
      
            this.lastRestockCheckDayTime = k;
            //Check for gamerule here to fix MC-245686
            if (flag || !level.getGameRules().getBoolean(GameRules.RULE_DAYLIGHT)) {
               this.lastRestockGameTime = j;
               this.resetNumberOfRestocks();
            }
      
            return this.allowedToRestock() && this.needsToRestock();
         }
      

            Unassigned Unassigned
            Xelrael Alex D
            Votes:
            5 Vote for this issue
            Watchers:
            5 Start watching this issue

              Created:
              Updated:
              CHK: