4jcraft/Minecraft.World/Entities/Mobs/ThrownEnderPearl.cpp
2026-03-13 17:06:56 -05:00

60 lines
2.5 KiB
C++

#include "../../Platform/stdafx.h"
#include "../../Headers/net.minecraft.world.phys.h"
#include "../../Headers/net.minecraft.world.damagesource.h"
#include "../../Headers/net.minecraft.world.entity.h"
#include "../../Headers/net.minecraft.world.level.h"
#include "../../../Minecraft.Client/Player/ServerPlayer.h"
#include "../../../Minecraft.Client/Network/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();
}
ThrownEnderpearl::ThrownEnderpearl(Level* level, std::shared_ptr<Mob> mob)
: Throwable(level, mob) {
// 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
std::shared_ptr<ServerPlayer> serverPlayer =
std::dynamic_pointer_cast<ServerPlayer>(owner);
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();
}
}