• Just a reminder that providing specifics on, sharing links to, or naming websites where ROMs can be accessed is against the rules. If your post has any of this information it will be removed.
  • Ever thought it'd be cool to have your art, writing, or challenge runs featured on PokéCommunity? Click here for info - we'd love to spotlight your work!
  • Which Pokémon Masters protagonist do you like most? Let us know by casting a vote in our Masters favorite protagonist poll here!
  • Red, Hilda, Paxton, or Kellyn - which Pokémon protagonist is your favorite? Let us know by voting in our poll!
  • 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

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...
 
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?
 
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?

Say that again.... But slowly.... Swords D A N C E.
 
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:
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:
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:
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 &&
 
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
 
"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.
 
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.
 
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)
 
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
 
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. :)
 
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
 
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