• Our software update is now concluded. You will need to reset your password to log in. In order to do this, you will have to click "Log in" in the top right corner and then "Forgot your password?".
  • Welcome to PokéCommunity! Register now and join one of the best fan communities on the 'net to talk Pokémon and more! We are not affiliated with The Pokémon Company or Nintendo.

Report bugs and errors in unmodified Essentials version 21

#Not Important

All hail the wishmaker
910
Posts
4
Years
    • Age 19
    • He/Him
    • Hoenn
    • Seen Jul 22, 2023
    Redownload Essentials, there's a new bugfix version.

    When was it released?
    EDIT:
    Today at 3:11 AM
    I've re-released Essentials v18 with a couple of extra bug fixes relating to editing PBS data via the in-game Debug menu (and a minor update to the plugin manager, and a tweak to the exclaim overworld animation). If you've already downloaded it, you should get it again. It's the same download link.
    I should be fine...
     
    308
    Posts
    4
    Years
  • In the method pbRoamingPokemonBattle in script section PField_RoamingPokemon in lines 234 and 235, the parameter index is not defined. I guess, it should be idxRoamer instead.

    This forces the game to crash when killing an roaming Pokemon.
     

    HM100

    HM100 the Techno
    113
    Posts
    7
    Years
    • Age 23
    • Seen Apr 27, 2024
    It appears that dancer is triggered in every move the user does, not in specific dance-based moves (Such as Swords Dance). Is it intentional?
     
    71
    Posts
    6
    Years
    • Age 32
    • Seen today
    Spoiler:


    edit4: used spoiler on previous comments to go straight to the point
    apparently in abilities the baseDmg and type are swapped, every condition like if isConst?(type,PBTypes,:STEEL)
    when i added "p type" and "p baseDmg" to testing it was constantly returning 40 on p type (base dmg of bullet punch which i was using to test) and 8 on baseDmg (8th type is steel)
    so from what i can tell that's the bug, those 2 things are swapped

    (i then did a temporary "fix" with this
    Code:
    BattleHandlers::DamageCalcUserAbility.add(:STEELWORKER,
      proc { |ability,user,target,move,mults,baseDmg,type|
    #    if isConst?(type,PBTypes,:STEEL)
        if baseDmg == 8
          mults[ATK_MULT] = (mults[ATK_MULT]*1.5).round
          p "ui"
        else
          p move.type
        end
      }
    )
    to check if the value of dmg is correct and the value of the dmg IS correct)
     
    Last edited:

    HM100

    HM100 the Techno
    113
    Posts
    7
    Years
    • Age 23
    • Seen Apr 27, 2024
    Another issue; When you evolve a Pokémon that it is set into an alternative form and its evolved form does not decide which form to be set automatically (Such as an Alolan Vulpix into Alolan Ninetales using Ice Stone), it will correctly display the alternative form when it evolves (Alolan Ninetales) but the outcome is the base form (AKA Alolan Vulpix evolved into Kantonian Ninetales). You can workaround this one:

    In PScreen_Evolution, find oldspeciesname = PBSpecies.getName(@pokemon.species) and paste below it:
    Code:
    oldform        = @pokemon.form
    Then find @pokemon.form = 0 if isConst?(@pokemon.species,PBSpecies,:MOTHIM) and paste above it the following code:
    Code:
    @pokemon.form    = oldform

    2nd Issue Found: Some issues arise in Fling Code because in pbCheckFlingSuccess it lacks the user variable defined. Replace the whole Fling Function code with this:
    Spoiler:
     
    Last edited:
    10
    Posts
    3
    Years
    • Age 20
    • She/It
    • Seen Aug 14, 2021
    I have encountered what I believe to be a bug.
    I have so far, only made the changes from HM100's errors, dynamic leveling, as well as adding pokemon and some simple sprite UI mods.
    My first error occurred when trying to access the Kanto Pokedex after turning it on via the debug menu.
    The latter occurs when I attempt to create a new save game, there is no difference whether I do it via changing title or clicking new game.

    Error #1:
    Spoiler:

    Error #1.5:
    Spoiler:

    Error #2:
    Spoiler:

    Edit: I was tired when I wrote this last night and didn't realize I mixed up two different dex errors and one single new game error.

    Edit2: I moved all my changes to a fresh copy of v18 and found the pokedex error was due to an error in my pokemon.txt PBS file. As for the saving error, this is presumably from some typo, as I cannot replicate it again on the fresh version.
     
    Last edited:
    71
    Posts
    6
    Years
    • Age 32
    • Seen today
    there's a bug when you overwrite same weather using an ability (i originally was testing sand spit when i found this out, i then tested with tyranitar sand stream and confirmed)
    how to replicate:
    send tyranitar in, switch him out turn 2
    send tyranitar in turn 3: you get the ability pop up graphic bugged and the ability doesnt fail

    how should work: ability should fail


    ----------
    i did some testing and changed
    Code:
    def pbBattleWeatherAbility(weather,battler,battle,ignorePrimal=false)
    i added
    Code:
    return if battle.field.weather==weather
    with this the bug is gone
    i also dont know if the weather duration -1 is supposed to permanent unremovable weather, but if thats the case then this line
    Code:
    return if battle.field.weather==weather && battle.field.weatherDuration==-1
    would work if there was a || instead of &&
     
    71
    Posts
    6
    Years
    • Age 32
    • Seen today
    in Protean this line
    Code:
    if user.pbHasOtherType?(moveType) && !PBTypes.isPseudoType?(move.calcType)
    was causing an error that forced the mon into an infinite loop of using same attack and displaying an error message

    i changed the 1st (moveType) to (move.calcType) and it's now working
     
    13
    Posts
    4
    Years
    • Age 21
    • Seen Apr 10, 2024
    "Go! *POKEMON*!" text didn't showed up if the foe's HP is full when I switch out.
    Code:
      def pbMessagesOnReplace(idxBattler,idxParty)
        party = pbParty(idxBattler)
        newPkmnName = party[idxParty].name
        if isConst?(party[idxParty].ability,PBAbilities,:ILLUSION)
          newPkmnName = party[pbLastInTeam(idxBattler)].name
        end
        if pbOwnedByPlayer?(idxBattler)
          opposing = @battlers[idxBattler].pbDirectOpposing
          if opposing.fainted? || opposing.hp==opposing.totalhp
            pbDisplayBrief(_INTL("You're in charge, {1}!",newPkmnName))
          elsif opposing.hp>=opposing.totalhp/2
            pbDisplayBrief(_INTL("Go for it, {1}!",newPkmnName))
          elsif opposing.hp>=opposing.totalhp/4
            pbDisplayBrief(_INTL("Just a little more! Hang in there, {1}!",newPkmnName))
          else
            pbDisplayBrief(_INTL("Your opponent's weak! Get 'em, {1}!",newPkmnName))
          end
        else
          owner = pbGetOwnerFromBattlerIndex(idxBattler)
          pbDisplayBrief(_INTL("{1} sent out {2}!",owner.fullname,newPkmnName))
        end
      end

    "*TRAINER* is about to send in *FOE POKEMON*. Will you switch your Pokémon?" text still shows up after this Pokemon faint and I switch a next one.
    And the Faint Cry sound isn't hear.

    This code is not the same in the gameplay but still a error.
     
    4
    Posts
    9
    Years
    • Age 29
    • Seen Oct 2, 2021
    So... I posted this over on Relic already, but I thought I might as well post it here too.

    When forcing the use of Salac Berry and it's cousins, it doesn't work when the user is at full HP.
    I tried to code in Stuff Cheeks, actually got it to work as well.
    But in testing I noticed that it doesn't actually get the effects of the held Salac Berry if I was at Full HP.
    At first I thought it was a mistake on my end, so I tried to shift some stuff around but it didn't work.

    Anyways, next thing I tried was using something Essentials already came with: Bug Bite.

    So instead of using Stuff Cheeks, I tricked my Salac Berry and used Bug Bite afterwards and saw the same results.
    Bug Bite itself works, but the user only gains the +1 Speed from the Salac Berry while not at Full HP.

    Since Bug Bite utilizes "pbHeldItemTriggerCheck", that was the thing I checked first. Due to the bahaviour of only triggering when having taken at least 1 HP damage, I figured I look into "pbItemHPHealCheck", which also lead to a dead end.
    Ultimately I checked the Salac Berry itself:
    Code:
    BattleHandlers::HPHealItem.add(:SALACBERRY,
      proc { |item,battler,battle,forced|
        next pbBattleStatIncreasingBerry(battler,battle,item,forced,PBStats::SPEED)
      }
    )
    "HPHealItem.add"
    The game treats it as a healing item, making it unable to be used when at Full HP, even if it's forced to be used.
     
    43
    Posts
    4
    Years
    • Age 28
    • He/Him
    • Seen Nov 11, 2023
    1) PBS: Alolan Nintetales is set to evolve into itself upon using an Ice Stone
    Spoiler:


    2) draining moves such as Leech Life do not restore HP when it is the final move in a battle (my Mega Beedrill one-hit KO'ed a Mewtwo with Leech Life, but did not recover any HP)
     
    71
    Posts
    6
    Years
    • Age 32
    • Seen today
    In soak code ->
    Code:
    #===============================================================================
    # Target becomes Water type. (Soak)
    #===============================================================================
    class PokeBattle_Move_061 < PokeBattle_Move
      def pbFailsAgainstTarget?(user,target)
        if !target.canChangeType? ||
           !target.pbHasOtherType?(getConst(PBTypes,:WATER))
          @battle.pbDisplay(_INTL("But it failed!"))
          return true
        end
        return false
      end
    
      def pbEffectAgainstTarget(user,target)
        newType = getConst(PBTypes,:WATER)
        user.pbChangeTypes(newType)
        typeName = PBTypes.getName(newType)
        @battle.pbDisplay(_INTL("{1} transformed into the {2} type!",target.pbThis,typeName))
      end
    end

    Code:
    user.pbChangeTypes(newType)
    needs to be changed to
    Code:
    target.pbChangeTypes(newType)
    else it'll change user type instead of its target
     
    143
    Posts
    4
    Years
    • Age 22
    • Seen Mar 26, 2024
    The abilities Beast Boost and Battlebond don't trigger when knocking out another Pokemon(even if the opponent has at least one other Pokemon left). I tried playing around with their functions a bit to find the error and I came as far as this:
    This line stops the code from working, because the if statement inside the block never returns true.
    Spoiler:
    When I changed it to b.damageState.unaffected and used a move that didn't affect the opponent it returned true, meaning the error has to do with the .fainted attribute.
    But looking at def pbRecordDamageLost, I noticed target.damageState.fainted turns true(which it does, I tested it):
    Spoiler:
    In conclusion target.damageState.fainted is true for every fainted target in the damage calculation, but never in the block call.
    Code:
    targets.each { |b| numFainted += 1 if b.damageState.fainted }
    I tried to find this error's source but failed. If anyone has some time they could look into this. :)
     

    #Not Important

    All hail the wishmaker
    910
    Posts
    4
    Years
    • Age 19
    • He/Him
    • Hoenn
    • Seen Jul 22, 2023
    The code for eachOpposing has no block to yield, so it gives a LocalJumpError. This is my fix:
    Code:
    # Yields each unfainted opposing Pokémon.
      def eachOpposing
        #@battle.battlers.each { |b| yield b if b && !b.fainted? && b.opposes?(@index) } OLD METHOD
       #                             ^ cannot yield nothing
        @battle.battlers.each { |b| return b if b && !b.fainted? && b.opposes?(@index) }
      end
     
    1,681
    Posts
    8
    Years
    • Age 24
    • Seen yesterday
    The code for eachOpposing has no block to yield, so it gives a LocalJumpError. This is my fix:
    Code:
    # Yields each unfainted opposing Pokémon.
      def eachOpposing
        #@battle.battlers.each { |b| yield b if b && !b.fainted? && b.opposes?(@index) } OLD METHOD
       #                             ^ cannot yield nothing
        @battle.battlers.each { |b| return b if b && !b.fainted? && b.opposes?(@index) }
      end

    That doesn't seem right, It's supposed to yield, and you call it with a block, else it would crash the second a battler was set up and sent in.
    with this code, I believe that some battlers won't be properly set up as participants, and fainting them will give no experience.
     
    Back
    Top