2026-03-01 12:16:08 +08:00
# include "stdafx.h"
# include "net.minecraft.world.phys.h"
# include "net.minecraft.world.damagesource.h"
# include "net.minecraft.world.entity.h"
# include "net.minecraft.world.level.h"
# include "..\Minecraft.Client\ServerPlayer.h"
# include "..\Minecraft.Client\PlayerConnection.h"
# include "ThrownEnderpearl.h"
ThrownEnderpearl : : ThrownEnderpearl ( Level * level ) : Throwable ( level )
{
// 4J Stu - This function call had to be moved here from the Entity ctor to ensure that
// the derived version of the function is called
this - > defineSynchedData ( ) ;
}
2026-03-02 15:58:20 +07:00
ThrownEnderpearl : : ThrownEnderpearl ( Level * level , std : : shared_ptr < Mob > mob ) : Throwable ( level , mob )
2026-03-01 12:16:08 +08:00
{
// 4J Stu - This function call had to be moved here from the Entity ctor to ensure that
// the derived version of the function is called
this - > defineSynchedData ( ) ;
}
ThrownEnderpearl : : ThrownEnderpearl ( Level * level , double x , double y , double z ) : Throwable ( level , x , y , z )
{
// 4J Stu - This function call had to be moved here from the Entity ctor to ensure that
// the derived version of the function is called
this - > defineSynchedData ( ) ;
}
void ThrownEnderpearl : : onHit ( HitResult * res )
{
if ( res - > entity ! = NULL )
{
DamageSource * damageSource = DamageSource : : thrown ( shared_from_this ( ) , owner ) ;
res - > entity - > hurt ( damageSource , 0 ) ;
delete damageSource ;
}
for ( int i = 0 ; i < 32 ; i + + )
{
level - > addParticle ( eParticleType_ender , x , y + random - > nextDouble ( ) * 2 , z , random - > nextGaussian ( ) , 0 , random - > nextGaussian ( ) ) ;
}
if ( ! level - > isClientSide )
{
// Fix for #67486 - TCR #001: BAS Game Stability: Customer Encountered: TU8: Code: Gameplay: The title crashes on Host's console when Client Player leaves the game before the Ender Pearl thrown by him touches the ground.
// If the owner has been removed, then ignore
2026-03-02 17:36:56 +07:00
std : : shared_ptr < ServerPlayer > serverPlayer = dynamic_pointer_cast < ServerPlayer > ( owner ) ;
2026-03-01 12:16:08 +08:00
if ( serverPlayer ! = NULL & & ! serverPlayer - > removed )
{
if ( ! serverPlayer - > connection - > done & & serverPlayer - > level = = this - > level )
{
owner - > teleportTo ( x , y , z ) ;
owner - > fallDistance = 0 ;
owner - > hurt ( DamageSource : : fall , 5 ) ;
}
}
remove ( ) ;
}
}