![[PokeCommunity.com] [Essentials v16.2+] Water Bubble [PokeCommunity.com] [Essentials v16.2+] Water Bubble](https://cdn.discordapp.com/attachments/568260046383743005/582673772348178439/Water_Bubble.gif)
I made a new Water Bubble Overworld, fixing dependent events bugs. Let's go!
First, save this image (called by water) inside Picture folder:
![[PokeCommunity.com] [Essentials v16.2+] Water Bubble [PokeCommunity.com] [Essentials v16.2+] Water Bubble](https://cdn.discordapp.com/attachments/568260046383743005/582674016360333313/water.png)
If you want to use it in v16.2, check here:
https://www.pokecommunity.com/posts/10154891
Now, find 'Sprite_WaterReflection' script and below that script, add a new script called "Sprite_WaterBubble" (or whatever you want) and paste this code inside the new script:
Spoiler:
Old Code:
Spoiler:
Code:
class Sprite_WaterBubble
attr_reader :visible
attr_accessor :event
def initialize(sprite,event,viewport=nil)
@rsprite = sprite
@sprite = nil
@event = event
@viewport = viewport
@wateranim=false
@frame = 0
@frames = 4
@totalFrames = 0
@currentIndex = 0
@disposed = false
@bitmapFile=BitmapCache.load_bitmap("Graphics/Pictures/water")
@water=Bitmap.new(@bitmapFile.width,@bitmapFile.height)
@water.blt(0,0,@bitmapFile,Rect.new(0,0,@bitmapFile.width,@bitmapFile.height))
@cws = @water.height*2
@chs = @water.height*2
@[email protected]/@water.height
@animationFrames=@totalFrames*@frames
@loop_points=[0,@totalFrames]
@actualBitmap=Bitmap.new(@cws,@chs)
@actualBitmap.clear
@actualBitmap.stretch_blt(Rect.new(0,0,@cws,@chs),@water,Rect.new(@currentIndex*(@cws/2),0,@cws/2,@chs/2))
update
end
def dispose
if !@disposed
@actualBitmap.dispose if @actualBitmap && [email protected]?
@sprite.dispose if @sprite
@sprite = nil
@disposed = true
@wateranim=false
end
end
def disposed?; @disposed; end
def createWaterAnim(x2,y2)
return if @wateranim
@sprite=Sprite.new(@viewport)
@sprite.bitmap=@actualBitmap
@sprite.x=x2
@sprite.y=y2
pbDayNightTint(@sprite)
@wateranim=true
end
def updateAnim
return if !@wateranim || @sprite && @sprite.disposed?
@frames=4
@frame+=1
if @frame >=@frames
@currentIndex+=1
@currentIndex=@loop_points[0] if @currentIndex >=@loop_points[1]
@currentIndex=@loop_points[1]-1 if @currentIndex < @loop_points[0]
@frame=0
end
@actualBitmap.clear
@actualBitmap.stretch_blt(Rect.new(0,0,@cws,@chs),@water,Rect.new(@currentIndex*(@cws/2),0,@cws/2,@chs/2))
@sprite.bitmap=@actualBitmap
end
def visible=(value); @visible = value; @sprite.visible = value if @sprite && [email protected]?; end
def jump_sprite
return unless @sprite
x = (@event.real_x - @event.map.display_x + 3) / 4 + (Game_Map::TILEWIDTH / 2)
y = (@event.real_y - @event.map.display_y + 3) / 4 + (Game_Map::TILEHEIGHT)
@sprite.x = x
@sprite.y = y
@sprite.z = @rsprite.z
end
def update
return if disposed?
return jump_sprite if event.jumping?
if pbGetTerrainTag(event)!=PBTerrain::Beach ||
event.character_name =="" || event.character_name == "nil" ||
event!=$game_player && pbEventCommentInput(event,0,"NoWater") || event.transparent
# Just-in-time disposal of sprite
if @sprite; @sprite.dispose; @sprite = nil; end
return
end
# Just-in-time creation of sprite
@sprite = Sprite.new(@viewport) if !@sprite
if @sprite
if pbGetTerrainTag(event)==PBTerrain::Beach
cw = @cws; ch = @chs
updateAnim
@wateranim=false if @sprite && @sprite.disposed?
x = @[email protected]; y = @[email protected]
createWaterAnim(x,y)
@sprite.update if @sprite
@sprite.x = @rsprite.x; @sprite.y = @rsprite.y
@sprite.ox = cw/2; @sprite.oy = ch -4
@sprite.z = @rsprite.z
@sprite.zoom_x = @rsprite.zoom_x; @sprite.zoom_y = @rsprite.zoom_y
@sprite.tone = @rsprite.tone
@sprite.color = @rsprite.color
@sprite.opacity = @rsprite.opacity
end
end
end
end
New Code:
Spoiler:
Code:
class Sprite_WaterBubble
attr_reader :visible
attr_accessor :event
def initialize(sprite,event,viewport=nil)
@rsprite = sprite
@sprite = nil
@event = event
@viewport = viewport
@wateranim=false
@frame = 0
@frames = 4
@totalFrames = 0
@currentIndex = 0
@disposed = false
@bitmapFile=BitmapCache.load_bitmap("Graphics/Pictures/water")
@water=Bitmap.new(@bitmapFile.width,@bitmapFile.height)
@water.blt(0,0,@bitmapFile,Rect.new(0,0,@bitmapFile.width,@bitmapFile.height))
@cws = @water.height*2
@chs = @water.height*2
@[email protected]/@water.height
@animationFrames=@totalFrames*@frames
@loop_points=[0,@totalFrames]
@actualBitmap=Bitmap.new(@cws,@chs)
@actualBitmap.clear
@actualBitmap.stretch_blt(Rect.new(0,0,@cws,@chs),@water,Rect.new(@currentIndex*(@cws/2),0,@cws/2,@chs/2))
update
end
def dispose
if !@disposed
@actualBitmap.dispose if @actualBitmap && [email protected]?
@sprite.dispose if @sprite
@sprite = nil
@disposed = true
@wateranim=false
end
end
def disposed?; @disposed; end
def createWaterAnim(x2,y2)
return if @wateranim
@sprite=Sprite.new(@viewport)
@sprite.bitmap=@actualBitmap
@sprite.x=x2
@sprite.y=y2
pbDayNightTint(@sprite)
@wateranim=true
end
def updateAnim
return if !@wateranim || @sprite && @sprite.disposed?
@frames=4
@frame+=1
if @frame >=@frames
@currentIndex+=1
@currentIndex=@loop_points[0] if @currentIndex >=@loop_points[1]
@currentIndex=@loop_points[1]-1 if @currentIndex < @loop_points[0]
@frame=0
end
@actualBitmap.clear
@actualBitmap.stretch_blt(Rect.new(0,0,@cws,@chs),@water,Rect.new(@currentIndex*(@cws/2),0,@cws/2,@chs/2))
@sprite.bitmap=@actualBitmap
end
def visible=(value); @visible = value; @sprite.visible = value if @sprite && [email protected]?; end
def jump_sprite
return unless @sprite
x = (@event.real_x - @event.map.display_x + 3) / 4 + (Game_Map::TILEWIDTH / 2)
y = (@event.real_y - @event.map.display_y + 3) / 4 + (Game_Map::TILEHEIGHT)
@sprite.x = x
@sprite.y = y
@sprite.z = @rsprite.z
end
def update
return if disposed? || !$scene || !$scene.is_a?(Scene_Map)
return jump_sprite if event.jumping?
if pbGetTerrainTag(event)!=PBTerrain::Beach ||
event.character_name =="" || event.character_name == "nil" ||
event!=$game_player && pbEventCommentInput(event,0,"NoWater") || event.transparent
# Just-in-time disposal of sprite
if @sprite; @sprite.dispose; @sprite = nil; end
return
end
# Just-in-time creation of sprite
@sprite = Sprite.new(@viewport) if !@sprite
if @sprite
cw = @cws; ch = @chs
updateAnim
@wateranim=false if @sprite && @sprite.disposed?
x = @[email protected]; y = @[email protected]
createWaterAnim(x,y)
@sprite.update if @sprite
@sprite.x = @rsprite.x; @sprite.y = @rsprite.y
@sprite.ox = cw/2; @sprite.oy = ch -4
@sprite.z = @rsprite.z
@sprite.zoom_x = @rsprite.zoom_x; @sprite.zoom_y = @rsprite.zoom_y
@sprite.tone = @rsprite.tone
@sprite.color = @rsprite.color
@sprite.opacity = @rsprite.opacity
end
end
end
Now, find 'Sprite_Character' script. Then:
Spoiler:
Inside 'def initialize(viewport, character = nil)', below '@surfbase = Sprite_SurfBase.new(self,character,viewport) if character==$game_player' add:
Code:
@waterbubblebitmap= Sprite_WaterBubble.new(self,character,viewport)
Inside 'def visible=(value)', below '@reflection.visible = value if @reflection' add:
Code:
@waterbubble.visible = value if @waterbubblebitmap
Inside 'def dispose', below '@reflection = nil' add:
Code:
@waterbubblebitmap.dispose if @waterbubblebitmap
@waterbubblebitmap = nil
Finally, inside 'def update', below '@reflection.update if @reflection', paste:
Code:
@waterbubblebitmap.update if @waterbubblebitmap
To the event doesn't works (won't show the water bubble effect) you need to put a Comment NoWater inside the event, to each page. Example to (Item Overworld event into the GIF):
Spoiler:
![[PokeCommunity.com] [Essentials v16.2+] Water Bubble [PokeCommunity.com] [Essentials v16.2+] Water Bubble](https://cdn.discordapp.com/attachments/568260046383743005/582672447971786752/unknown.png)
JUST A P.S. DON'T COPY:
That is the code to check if event are walking into "beach" base tile (to remove the water bubble effect if not). You can add more if you want to:
Code:
currentTag = pbGetTerrainTag(event)
if currentTag!=PBTerrain::Beach
# Just-in-time disposal of sprite
if @sprite
@sprite.dispose
@sprite = nil
end
return
end
Spoiler:
Code:
Puddle = 16
Beach = 17
Code:
def PBTerrain.isBeach?(tag)
return tag==PBTerrain::Beach
end
def PBTerrain.onlyWalk?(tag)
return tag==PBTerrain::TallGrass ||
tag==PBTerrain::Ice
end
Thanks KleinStudio for the code about water bubble animation.
Give credits to me (WolfPP) and KleinStudio (because i copied his "water bubble animation" into Water Bubble script) if use.
Cya!
Last edited: